Ich will die Zeit von 1 Superkonvergenz zur nächsten Ausrechnen (alle Planis in Reihe) Die Zeitabstände zwischen den Konvergenzen 2 Planis waren schnell ermittelt. Hier die Werte:
Zitat: |
T der Konvergenz zweier Planeten in Sekunden
Merkur und Venus: 12490723 Sekunden
Venus und Erde: 50449536 Sekunden
Erde und Mars: 67387895 Sekunden
Mars und Jupiter: 70542186 Sekunden
Jupiter und Saturn: 626771479 Sekunden
Saturn und Uranus: 1430239139 Sekunden
Uranus und Neptun: 5408462799 Sekunden |
Wenn mehrere Planis in Reihe stehen sollen, isses ja einfach nur das KGV (kleinste Gemeinsame Vielfache). Blos wie ermittle ich das am effizientesten? Das Ergebnis ist ja größer als der Wertebereich von Int64... Habe es jetzt über Primfaktrorenzerlegung und (also auch mal interessehalber ne Frage in Richtung optimierung) Hier mein Code, der das errechnet:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| ZeroMemory(@Prims,sizeof(Prims)); specialPrims:=1;
for i := 0 to 7 do begin ZeroMemory(@tmpPrim,sizeOf(tmpPrim)); rest:=collisions[i]; divisor:=1; PrimFound:=false;
repeat inc(divisor); if divisor>125000 then begin specialprims:=specialprims * rest; PrimFound:=true; end;
if rest mod divisor = 0 then begin inc(tmpPrim[divisor]); rest:=rest div divisor; divisor:=1; end; until (rest=0) or PrimFound;
for j := 0 to 125000 do if Prims[j]<tmpPrim[j] then Prims[j]:=tmpPrim[j]; end;
tGes:=1*specialPrims; for i := 0 to 125000 do if Prims[i]<>0 then tGes:=tGes * Prims[i]; |
das kgv steht dann in tges als extended... (1,34090900765759E19, das es nen floatwert ist, stört nich, Abweichung ist OK)
nochmal die Fragen auf den Punkt gebracht:
a) stimmt das Ergebnis überhaupt? Habe da so meine Zweifel...
b) wie geht es eleganter? 2 Arrays über 125'000 Felder, die Mehrmals voll durchlaufen werden, kann wohl nicht die effizienteste Lösung sein
MfG Zemy