Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   sehr schneller Rechner gesucht (https://www.delphipraxis.net/159228-sehr-schneller-rechner-gesucht.html)

mikeslash 18. Mär 2011 20:05

sehr schneller Rechner gesucht
 
Hallo,
würde mir jemand den Gefallen tun und mein Programm auf einem sehr schnellen Rechner laufen lassen? Mein acht Jahre alter Celeron hat hier keine Chance. Kann aber bestimmt einige Stunden in Anspruch nehmen. Das Programm sucht und ordnet bestimmte binäre Tupel der Collazt-Iteration und speichert das Ergebnis als "MIKES LISTE" im Verzeichnis C. Der Fortschritt im Algorithmus wird als Pixel in einem 500x500 Quadrat angezeigt. Würde die erste Linie schon 5 Minuten dauern, so läuft der Algorithmus mindestens 42 Stunden. Man kann also schnell erkennen, ob sich ein Weitersuchen überhaupt lohnt. Vielleicht kann mein Algorithmus aber auch beschleunigt werden, bin für jeden Tipp dankbar.

Viele Grüße,
Mike


Delphi-Quellcode:
var
  Form1: TForm1;

  b,c,g,u,x,uWert,Grenze: extended;
  i: integer;
  j,y: variant;
  k1,k2,k3,k4,k5,k6,k7,k8,k9,k10,k11,k12,k13,k14,k15,k16,k17,k18,k19,k20: integer;
    k21,k22,k23,k24,k25,k26,k27,k28,k29,k30: integer;
  h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11,h12,h13,h14,h15,h16,h17,h18,h19,h20,h21,h22,h23,h24,h25,h26,h27,h28,h29: integer;
  m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18,m19,m20,m21,m22,m23,m24,m25,m26,m27,m28: integer;
  Liste: TStringList;
  sn: array[0..100] of integer;



implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin


  Liste:=TStringList.Create;

  k1:=0; k2:=0; k3:=0; k4:=0; k5:=0; k6:=0; k7:=0; k8:=0; k9:=0; k10:=0;
  k11:=0; k12:=0; k13:=0; k14:=0; k15:=0; k16:=0; k17:=0; k18:=0; k19:=0; k20:=0;
  k21:=0; k22:=0; k23:=0; k24:=0; k25:=0; k26:=0; k27:=0; k28:=0; k29:=0; k30:=0;


  b:=3; u:=0; g:=0; j:=0; y:=0; Grenze:=84141805077; uWert:=30;


  repeat

    c:=b;
    repeat
      if frac((c+1)/2)=0 then begin c:=(3*c+1)/2; u:=u+1; end;
      if frac(c/2)=0 then c:=c/2;

      if u>uWert then break;

    until (c<b) and (frac((c+1)/2)=0);



    if u=uWert then begin

      i:=0; c:=b; g:=g+1;

      sn[i]:=1; i:=i+1;
      c:=(3*c+1)/2;
      repeat
        if frac(c/2)=0 then begin sn[i]:=0; i:=i+1; c:=c/2; end
                       else begin sn[i]:=1; i:=i+1; c:=(3*c+1)/2; end;
      until i>u;


      if (sn[0]=1) and (sn[1]=0)
      then k1:=k1+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=0)
      then k2:=k2+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=0)
      then k3:=k3+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=0)
      then k4:=k4+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=0)
      then k5:=k5+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=0)
      then k6:=k6+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=0)
      then k7:=k7+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=0)
      then k8:=k8+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=0)
      then k9:=k9+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=1) and (sn[10]=0)
      then k10:=k10+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=1) and (sn[10]=1) and (sn[11]=0)
      then k11:=k11+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=1) and (sn[10]=1) and (sn[11]=1) and (sn[12]=0)
      then k12:=k12+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=1) and (sn[10]=1) and (sn[11]=1) and (sn[12]=1)
                   and (sn[13]=0)
      then k13:=k13+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=1) and (sn[10]=1) and (sn[11]=1) and (sn[12]=1)
                   and (sn[13]=1) and (sn[14]=0)
      then k14:=k14+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=1) and (sn[10]=1) and (sn[11]=1) and (sn[12]=1)
                   and (sn[13]=1) and (sn[14]=1) and (sn[15]=0)
      then k15:=k15+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=1) and (sn[10]=1) and (sn[11]=1) and (sn[12]=1)
                   and (sn[13]=1) and (sn[14]=1) and (sn[15]=1) and (sn[16]=0)
      then k16:=k16+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=1) and (sn[10]=1) and (sn[11]=1) and (sn[12]=1)
                   and (sn[13]=1) and (sn[14]=1) and (sn[15]=1) and (sn[16]=1)
                   and (sn[17]=0)
      then k17:=k17+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=1) and (sn[10]=1) and (sn[11]=1) and (sn[12]=1)
                   and (sn[13]=1) and (sn[14]=1) and (sn[15]=1) and (sn[16]=1)
                   and (sn[17]=1) and (sn[18]=0)
      then k18:=k18+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=1) and (sn[10]=1) and (sn[11]=1) and (sn[12]=1)
                   and (sn[13]=1) and (sn[14]=1) and (sn[15]=1) and (sn[16]=1)
                   and (sn[17]=1) and (sn[18]=1) and (sn[19]=0)
      then k19:=k19+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=1) and (sn[10]=1) and (sn[11]=1) and (sn[12]=1)
                   and (sn[13]=1) and (sn[14]=1) and (sn[15]=1) and (sn[16]=1)
                   and (sn[17]=1) and (sn[18]=1) and (sn[19]=1) and (sn[20]=0)
      then k20:=k20+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=1) and (sn[10]=1) and (sn[11]=1) and (sn[12]=1)
                   and (sn[13]=1) and (sn[14]=1) and (sn[15]=1) and (sn[16]=1)
                   and (sn[17]=1) and (sn[18]=1) and (sn[19]=1) and (sn[20]=1)
                   and (sn[21]=0)
      then k21:=k21+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=1) and (sn[10]=1) and (sn[11]=1) and (sn[12]=1)
                   and (sn[13]=1) and (sn[14]=1) and (sn[15]=1) and (sn[16]=1)
                   and (sn[17]=1) and (sn[18]=1) and (sn[19]=1) and (sn[20]=1)
                   and (sn[21]=1) and (sn[22]=0)
      then k22:=k22+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=1) and (sn[10]=1) and (sn[11]=1) and (sn[12]=1)
                   and (sn[13]=1) and (sn[14]=1) and (sn[15]=1) and (sn[16]=1)
                   and (sn[17]=1) and (sn[18]=1) and (sn[19]=1) and (sn[20]=1)
                   and (sn[21]=1) and (sn[22]=1) and (sn[23]=0)
      then k23:=k23+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=1) and (sn[10]=1) and (sn[11]=1) and (sn[12]=1)
                   and (sn[13]=1) and (sn[14]=1) and (sn[15]=1) and (sn[16]=1)
                   and (sn[17]=1) and (sn[18]=1) and (sn[19]=1) and (sn[20]=1)
                   and (sn[21]=1) and (sn[22]=1) and (sn[23]=1) and (sn[24]=0)
      then k24:=k24+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=1) and (sn[10]=1) and (sn[11]=1) and (sn[12]=1)
                   and (sn[13]=1) and (sn[14]=1) and (sn[15]=1) and (sn[16]=1)
                   and (sn[17]=1) and (sn[18]=1) and (sn[19]=1) and (sn[20]=1)
                   and (sn[21]=1) and (sn[22]=1) and (sn[23]=1) and (sn[24]=1)
                   and (sn[25]=0)
      then k25:=k25+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=1) and (sn[10]=1) and (sn[11]=1) and (sn[12]=1)
                   and (sn[13]=1) and (sn[14]=1) and (sn[15]=1) and (sn[16]=1)
                   and (sn[17]=1) and (sn[18]=1) and (sn[19]=1) and (sn[20]=1)
                   and (sn[21]=1) and (sn[22]=1) and (sn[23]=1) and (sn[24]=1)
                   and (sn[25]=1) and (sn[26]=0)
      then k26:=k26+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=1) and (sn[10]=1) and (sn[11]=1) and (sn[12]=1)
                   and (sn[13]=1) and (sn[14]=1) and (sn[15]=1) and (sn[16]=1)
                   and (sn[17]=1) and (sn[18]=1) and (sn[19]=1) and (sn[20]=1)
                   and (sn[21]=1) and (sn[22]=1) and (sn[23]=1) and (sn[24]=1)
                   and (sn[25]=1) and (sn[26]=1) and (sn[27]=0)
      then k27:=k27+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=1) and (sn[10]=1) and (sn[11]=1) and (sn[12]=1)
                   and (sn[13]=1) and (sn[14]=1) and (sn[15]=1) and (sn[16]=1)
                   and (sn[17]=1) and (sn[18]=1) and (sn[19]=1) and (sn[20]=1)
                   and (sn[21]=1) and (sn[22]=1) and (sn[23]=1) and (sn[24]=1)
                   and (sn[25]=1) and (sn[26]=1) and (sn[27]=1) and (sn[28]=0)
      then k28:=k28+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=1) and (sn[10]=1) and (sn[11]=1) and (sn[12]=1)
                   and (sn[13]=1) and (sn[14]=1) and (sn[15]=1) and (sn[16]=1)
                   and (sn[17]=1) and (sn[18]=1) and (sn[19]=1) and (sn[20]=1)
                   and (sn[21]=1) and (sn[22]=1) and (sn[23]=1) and (sn[24]=1)
                   and (sn[25]=1) and (sn[26]=1) and (sn[27]=1) and (sn[28]=1)
                   and (sn[29]=0)
      then k29:=k29+1;

      if (sn[0]=1) and (sn[1]=1) and (sn[2]=1) and (sn[3]=1) and (sn[4]=1)
                   and (sn[5]=1) and (sn[6]=1) and (sn[7]=1) and (sn[8]=1)
                   and (sn[9]=1) and (sn[10]=1) and (sn[11]=1) and (sn[12]=1)
                   and (sn[13]=1) and (sn[14]=1) and (sn[15]=1) and (sn[16]=1)
                   and (sn[17]=1) and (sn[18]=1) and (sn[19]=1) and (sn[20]=1)
                   and (sn[21]=1) and (sn[22]=1) and (sn[23]=1) and (sn[24]=1)
                   and (sn[25]=1) and (sn[26]=1) and (sn[27]=1) and (sn[28]=1)
                   and (sn[29]=1) and (sn[30]=0)
      then k30:=k30+1;



      x:=(g+1)/int(Grenze/250000);
      if frac(x)=0 then begin
                          j:=j+1;
                          if j>500 then begin j:=0; y:=y+1; end;
                          canvas.pixels[30+j,100+y]:=clblack;
                        end;


     end;



    b:=b+2; u:=0;

  until g>Grenze;


   h1:=k2-k1;
   h2:=k3-k2;
   h3:=k4-k3;
   h4:=k5-k4;
   h5:=k6-k5;
   h6:=k7-k6;
   h7:=k8-k7;
   h8:=k9-k8;
   h9:=k10-k9;
   h10:=k11-k10;
   h11:=k12-k11;
   h12:=k13-k12;
   h13:=k14-k13;
   h14:=k15-k14;
   h15:=k16-k15;
   h16:=k17-k16;
   h17:=k18-k17;
   h18:=k19-k18;
   h19:=k20-k19;
   h20:=k21-k20;
   h21:=k22-k21;
   h22:=k23-k22;
   h23:=k24-k23;
   h24:=k25-k24;
   h25:=k26-k25;
   h26:=k27-k26;
   h27:=k28-k27;
   h28:=k29-k28;
   h29:=k30-k29;

   m1:=h2-h1;
   m2:=h3-h2;
   m3:=h4-h3;
   m4:=h5-h4;
   m5:=h6-h5;
   m6:=h7-h6;
   m7:=h8-h7;
   m8:=h9-h8;
   m9:=h10-h9;
   m10:=h11-h10;
   m11:=h12-h11;
   m12:=h13-h12;
   m13:=h14-h13;
   m14:=h15-h14;
   m15:=h16-h15;
   m16:=h17-h16;
   m17:=h18-h17;
   m18:=h19-h18;
   m19:=h20-h19;
   m20:=h21-h20;
   m21:=h22-h21;
   m22:=h23-h22;
   m23:=h24-h23;
   m24:=h25-h24;
   m25:=h26-h25;
   m26:=h27-h26;
   m27:=h28-h27;
   m28:=h29-h28;

   Liste.Add(Format('%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d',

   [floor(m1), floor(m2), floor(m3), floor(m4), floor(m5), floor(m6), floor(m7), floor(m8), floor(m9), floor(m10),
   floor(m11), floor(m12), floor(m13), floor(m14), floor(m15), floor(m16), floor(m17), floor(m18), floor(m19), floor(m20),
   floor(m21), floor(m22), floor(m23), floor(m24), floor(m25), floor(m26), floor(m27), floor(m28)
   ]));

  Liste.SaveToFile('C:\MIKES LISTE.txt');

  showmessage('Fertig');

end;

Luckie 18. Mär 2011 20:09

AW: sehr schneller Rechner gesucht
 
Lass das Zeichen weg und stell den Fortschritt anders da. Und vorallem Speichere die Daten wo anders. Bei mir müsste das Programm mit Admin-Rechten laufen und das werde ich bestimmt nicht tun.

Phoenix 18. Mär 2011 20:20

AW: sehr schneller Rechner gesucht
 
Also, auf den ersten Blick sieht es so aus, als würdest Du das Array von integern NUR dazu verwenden, nullen und einsen zu speichern. Und das auch nur in den ersten 30 Feldern des 100-teiligen Arrays.

Ich würde daher empfehlen anstelle des arrays SN einen einzigen DOUBLE zu verwenden. Der kann mit seinen 4 byte = 32 bit genau die gleiche Datenmenge abbilden wie Du sie verwendest.

UNd dann würde ich die ganzen Operationen bitweise machen und auch die ganzen Vergleiche auf Bitmasken umstellen.
Das hat den *riesigen* Vorteil, dass ein Bitvergleich über 32 byte genau in einer Rechenoperation auf der CPU erledigt werden kann. Derzeit machst Du bei jedem Durchlauf 30 fakultät viele Indizierte Zugriffe auf das array (die jedesmal ein paar rechenoperationen verwenden), was mit 30 einzelnen Bitweisen operationen zu machen wäre.

Das spart Dir faktoren an Zeit.

fkerber 18. Mär 2011 20:25

AW: sehr schneller Rechner gesucht
 
Von zeichnen sehe ich hier allerdings auch nichts, oder?

Namenloser 18. Mär 2011 20:26

AW: sehr schneller Rechner gesucht
 
Double? Du meinst wohl longint. Double ist float.

Phoenix 18. Mär 2011 20:26

AW: sehr schneller Rechner gesucht
 
Der Canvas - pixel-teil da unter den 'bit' vergleichen und vor der langen zuweisungsreihe in der mitte versteckt ;-)

Assarbad 18. Mär 2011 20:34

AW: sehr schneller Rechner gesucht
 
Zitat:

Zitat von Phoenix (Beitrag 1089549)
Ich würde daher empfehlen anstelle des arrays SN einen einzigen DOUBLE zu verwenden. Der kann mit seinen 4 byte = 32 bit genau die gleiche Datenmenge abbilden wie Du sie verwendest.

Does not compute.

Double ist 64bit breit, Single ist 32bit.

ms-help://embarcadero.rs_xe/vcl/System.Double.html

Zitat:

Defines a double-precision floating-point number.

Double is a double-precision real type that is represented with floating-point notation. The range of the Double type is from 5.0 x 10^-324 through 1.7 x 10^308. The size of a Double value is 8 bytes.
NB: du hast allerdings dahingehend recht, daß ein Double verlustlos beliebige 32bit-Integerwerte darstellen kann (also ohne Rundungsverluste).

divBy0 18. Mär 2011 22:42

AW: sehr schneller Rechner gesucht
 
Bin erst nächstes Wochenende wieder zu Hause, könnte deinen Code dann mal mit einem Intel Core i7-970 (3.2GHz, 6.4GT/s, 12MB) testen.

Allerdings läuft dein Code ja nur auf einem von sechs Kernen.

mikeslash 18. Mär 2011 23:22

AW: sehr schneller Rechner gesucht
 
Oh, ich hätte gedacht, dass sich das automatisch auf alle Kerne verteilt. Kann man es denn auch so programmieren, dass alle Kerne genutzt werden?

Gruß, Mike

Medium 19. Mär 2011 00:44

AW: sehr schneller Rechner gesucht
 
Pro Thread ein Kern --> Aufteilung auf mehrere parallel arbeitende Threads. Nicht jedes Problem ist allerdings parallelisierbar, und bei nicht jedem ist die Eignung offensichtlich, bzw. muss sie erst hergestellt werden. Ich hab jetzt leider nicht mehr die Wachheit das in diesem Fall zu überblicken :cyclops:. Sobald der Fall gegeben ist, dass Teilergebnisse nicht von der Gesamtheit voriger Ergebnisse abhängen, ist Parallelisierung in der Regel möglich. Automatisch passiert in diese Richtung aber nix.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:59 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz