Situația numerelor în ultima parte din 2010, așa cum se vedea din 2014

La 16 septembrie 2010 am găsit metoda de a depozita numerele în fișier, în C++, și de acolo să le încarce în vector, la rulare, să nu mai fie manual scrise în el în fișier, astfel salvând spațiu în fișier și în executabil. Așa nu mai era nevoie de chinul scrierii manuale în fișier, cu formatare cu cast la Big, și cu lanț de înmulțiri. Trebuisem să găsesc tactici speciale de scriere a numerelor în fișier, cu (Big) și înmulțiri cu factori mai mici de 2147483648, care să compună fiecare număr de legătură dintre cele mai mari și să poată fi citiți, căci dacă se depășea 2 la puterea 32 memoria lui Borland C++ interpreta greșit numărul.

Erau 4013 numere, 4102 cu cei 89 de șeptari. În zorii zilei de 16 septembrie, la ora 6 dimineața, erau 3997 de numere plus cele 89.

Numerele-sursă erau stocate într-o zonă specială de vector (sau de fișier, după ce am început depozitarea în fișiere).
În dimineața de 25 septembrie 2010 limita superioară a numerelor era de 10 la puterea 131, iar la 1 octombrie, 10 la puterea 138, în urma aducerii de noi multiperfecte și semiperfecte din care să obțin numere cu numitori abundențiali mai mari de 2.

La 4 noiembrie 2010 a fost inaugurat fondul II numeric, cu numere ale căror fracții din abundențe erau unsprezecimi, douăsprezecimi și așa mai departe, ca să ajute în plus la descoperirea de numere unele din altele.
Erau considerate materie reziduală, de manevră, iar fișierul de depozit s-a numit RZ.TXT. Atunci șeptarii au fost uniți cu restul numerelor de fond I.

În decembrie 2010 (în a doua jumătate) fondul II avea 36700 de numere, iar fondul I peste 6000, și se opreau pe la 160-170 de cifre (mă concentram pe zona de numere de mărime până la acea limită). Împreună făceau circa 43000 de numere.

Procedeul de căutare însemna memorarea în RAM, în vector, a numerelor găsite, și la sfârșit erau scrise în fișier, la rezultate. Mai înainte se scriau pe ecran, când nu exista fondul adițional. Dacă avea loc o pană de curent, căutarea trebuia refăcută de la început, căci se pierdea vectorul de rezultate din memorie.

La 19 decembrie 2010 a fost proiectat un corp de funcții care să extragă toate numerele prime distincte din toate numerele, și să le ordoneze convenabil: mai întâi numerele prime care apăreau la mai mult de o putere (la a doua, a treia sau mai mult), apoi celelalte; și de asemenea, pentru fiecare secțiune de numere prime, să apară întâi cele mai folosite (care apar de mai multe ori în numere). În acest fel la căutare se luau în calcul, mai întâi, cei mai populari factori primi, ca un Cache, pentru ușurarea obținerii de rezultate.

Și secțiunile de numere prime din vectorul lor erau trei:
-Numerele prime care apăreau la mai mult de o putere (3, 5, 7, 11 și altele); toate pe 32 de biți;
-Numerele prime la putere unică, dar egale cu cel mult 2147483647 (maximul de număr întreg normal care putea fi folosit în operații cu numere de tip Big);
-Numere prime mai mari de atât, care erau mai puține, și tot la putere unică.

În fapt, erau puse în doi vectori: unul de tip long, pentru primele 2 secțiuni, și un Big pentru celelalte. Operațiile cu factorii primi de tip long erau mai rapide.

Multe dintre numere aveau numai factori primi de tip long.
Borland C++ era pe 32 de biți.
În acest corp funcția principală era TOLIL(), care scotea factorii primi din numerele de fond I și II depozitate deja: se parcurgeau vectorii de factori primi și se verifica prezența fiecărui factor în numere (când factorul era găsit într-un număr, nu se mai verifica mai departe, era de ajuns să fie găsit într-un număr din cele 2 fonduri).

Factorii găsiți erau trimiși tot în doi vectori, un long și un Big.
Mai departe funcția MAXPUT() separa factorii primi care apăreau la peste o putere, și arăta și puterile maxime pentru fiecare, de exemplu 20 pentru 3. Apoi erau funcțiile TOL2() și TOL3(), care ordonau factorii primi din cele 3 secțiuni de mai sus, începând cu cele mai găsite numere prime.

(va urma)

Comentarii

Postări populare