Continuarea acelei cronologii sinuoase a numerelor (Partea II)

În noiembrie 2009 am remarcat că pot să parcurg divizorii unui număr de la radical în jos, stocând undeva valoarea radicalului și comparând cu număr mic (1 sau 0), sau chiar fără comparare.
for(i = n; i; --i), unde în n e valoarea radicalului din N.

La rândul lor divizorii numărului erau supuși procesului: Se face abundența numărului (suma divizorilor pe număr) și se verifică la fracții. La acea vreme nu acceptam șeptimile, care au perioadă lungă.

La un număr de 22 de cifre a durat zile la rând în noiembrie 2009, și nu a verificat foarte mult din divizori.
Eram cu Borland C/C++ 5.5.1 (Command line tools) sub Windows XP, am început să-l folosesc atunci, reprezenta exact pe ecran 19 sau 20 de cifre dintr-un număr (față de primele 18 la BorlandC 3.1).
Când numărul avea 22 de cifre și ultimele 3-4-5 erau zero, era pus exact pe ecran.
Dar metoda de parcurs divizorii și divizorii divizorilor nu lucra repede cu multe numere de acolo.

Luam numere multiperfecte și semiperfecte (Numericana.com) și porneam de la ele, cu parcurgerea divizorilor sau a multiplilor lor, din 1 în 1, și fiecare număr țintit era verificat la divizori.
În long double calculam chiar suma, cu această metodă, și făceam câtul înpărțirii la număr, dacă conține doimi, treimi, pătrimi, cincimi, șesimi, optimi, noimi, zecimi, sau e întreg, fără șeptimi.

Am petrecut mai multe luni căutând așa la numere, în special prin divizorii unui număr mare ales (22, 23, 24 de cifre), zile de lucru, continuu, zi și noapte (m-am obișnuit așa de atunci).

Numerele noi intrau în BAZNUM.TXT, pe rubrici cu abundențe, le puneam manual.
Dar abundențele, așa cum le voiam interpretate atunci, erau cu 1 mai mici decât cele adevărate, pentru că am considerat suma divizorilor fără numărul însuși, și abundența scădea automat cu 1, lipsind împărțirea numărului la el însuși.
În primăvara anului 2010 am văzut că în C++ (cin, cout) se face în 8 ore o treabă care la C (printf, scanf) dura 9 ore, așa că am preferat C++, care avea să fie și la MIRACL.

Am folosit fmodl pentru rest, modfl pentru partea fracționară.
În decembrie 2007, în Pascal, foloseam frac(x) pentru partea fracționară a abundenței. Am găsit și atunci câteva zeci de numere (poate 20-30) pentru BAZNUM.TXT.
În primăvara 2010 am construit un vector cu peste 1000 de coeficienți de legătură (factori cu care numerele se obțineau unele din altele, înmulțire/împărțire).

La 18 mai 2010 am pus programul cu MIRACL să facă sume parțiale de divizori pentru numere, neputând parcurge și aduna în timp util toți divizorii (doar o parte), ca să se vadă cu ce seamănă abundențele.

În noaptea de 20 mai 2010 am găsit că suma divizorilor se poate calcula pe baza puterilor factorilor primi ai numărului. Factorii primi din numerele folosite se repetau, sau oricum nu erau mulți în plus, când apăreau noi, așa că puteau fi stocați într-un vector (cam 100 sau câți erau atunci) și luați de acolo pentru numerele folosite (numerele de bază erau multi- și semiperfectele, și pe Numericana erau și niște factorizări ale lor la vedere).

Facerea sumei în MIRACL pe baza factorilor primi luați din vector a însemnat eliminarea parcurgerii divizorilor, de atunci. A fost un progres important și a deschis calea către mai multe numere noi aduse de acum cu MIRACL.

(va urma)

Comentarii

Postări populare