Delphi-Quellcode:
var
Form1: TForm1;
Liste: TStringList;
count,c,g,u: int64;
k6,k7,k8:int64;
h6,h7,m6: int64; // die können Integer vielleicht überschreiten!
i:byte;
s0,s1,s2,s3,s4,s5,s6,s7,s8: byte;
FRun : Bool;
implementation
{$R *.DFM}
procedure TForm1.BStartClick(Sender: TObject);
var s: array [1..8] of byte;
begin
FRun := True;
count:=3;
u:=0; g:=0;
k6:=0; k7:=0; k8:=0; // variablen für auswertung
repeat //1
c := count;
repeat //2
if odd(c) then
begin c:=(3*c+1) div 2; inc(u); end
else
c:=c div 2;
if u > 30 then break;
until (c < count) and (odd(c) ); //2
if u=30 then begin
c:=count;
i:=1;
inc(g); //zählt wie oft dieser fall eintritt
c:= (3*c +1) div 2;
repeat
if odd(c) then
begin
c:=(3*c+1) div 2;
s[i] := 1; //wir merken uns, dass die iteration[i] ungerade ist
end
else
begin
c:=c div 2;
s[i] := 0;
end;
inc(i);
until i > 8;
i:=1;
while s[i]=1 do inc(i); //liefert den index von der ersten 0
if i=6 then inc(k6);
if i=7 then inc(k7);
if i=8 then inc(k8);
end;
inc(count,2);
u:=0;
if (count AND $FFFE) = 0 then
begin
application.ProcessMessages;
if not frun then exit;
label1.Caption := inttostr(count);
label2.Caption := 'g:' + inttostr(g);
label3.Caption := 'k6:' + inttostr(k6);
label4.Caption := 'k7:' + inttostr(k7);
label5.Caption := 'k8:' + inttostr(k8);
end;
until g>84141805077; //1
h6:=k7-k6; h7:=k8-k7; m6:=h7-h6;
Liste:=TStringList.Create;
Liste.Add('k6: '+inttostr(k6));
Liste.Add('k7: '+inttostr(k7));
Liste.Add('k8: '+inttostr(k8));
Liste.Add('m6: '+inttostr(m6));
Liste.SaveToFile('MIKES LISTE.txt');
Liste.Free;
Showmessage('Fertig');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FRun := false;
end;
Die weiteren kleinen Optimierungen wirken sich aus: 150.000 pro Minute (für 'g') bei 2,5Ghz - single threaded. Laufzeit bis 84Mrd: 12 Monate. Wie bist du eigentlich auf diese 84Mrd. Zahl gekommen? Ist diese Zahl fix?
Wenn wir g auf 1 bis 10 Mrd. reduzieren können, kommen wir in einen Bereich der für einen normalen PC realistisch wird! Geht das?
(Andererseits wäre eine Variante den Code Multithreaded laufen zu lassen, wenn möglich - da könnte man 4-8x schneller werden. Oder man portiert das ganze auf CUDA und lässt es eine Geforce rechnen. Ich kann mir vorstellen, dass man da noch 100x schneller wird.)
Stefan
Jedoch kann die referenzbasierte Implementierung des Standard-Objektmodells in Kombination mit den komplexen syntaktischen Dereferenzierungsregeln bei einer objektorientierten
API wie ein Stolperstein wirken.