Însemnări numerice și algoritmice din prima parte a lui 2014 (Partea I)

(Totuși le-am mai editat, să fie mai de înțeles)
Așa făceam planuri la începutul acelui an, când, stabilizându-mă treptat cu serviciul, revoiam numere.

*

Bibliotecă de numere aleatorii: RandomLib.

mpir_ui mulInt[10], impInt[10];
int mulPut[10], impPut[10];

mpir_ui sumInt[100], divInt[100], copSumInt[100], copDivInt[100];//Puterile factorilor primi ai numărului de bază NUM și sumele lui parțiale de divizori intră aici

Trebuie să se aleagă în funcție de o variabilă (0 sau 1) câte înmulțiri și câte împărțiri la puteri de factori primi se fac.
r1.IntegerC(1, 10);//puteri de 2, la substituție; trebuiesc și ele
r1.IntegerC(1, 4);//Atâția factori primi
r1.IntegerC(0, 18);//Până la acest index din vectorul de factori primi
Un vector de puteri de factori primi, cu puteri de tipul 1, 2, 3... ca la JEDENASCIE
r1.IntegerC(1, vec[i]): ambitus de puteri din vector

Construcția sumei inițiale, SUM (suma divizorilor lui NUM);
MODIFSUM face schimbarea numărului de bază împreună cu suma. Dar astăzi mai sunt și alte programe care schimbă numărul și suma, în mod specific (MODSPRIM, NUMSIMPL, MODMIN de exemplu).

La intrarea la factor, dacă este împărțire se verifică obligatoriu dacă factorul este divizor al numărului (mpz_divisible) și dacă puterea aleatorie nu o depășește pe cea originală (dacă nu se satisfac cele două condiții, se pleacă imediat de la factor). Mai degrabă divizibilitatea cu puterea (același factor prim poate fi vizitat de mai multe ori pentru împărțire, când indexul vectorului de factori vizitabili se dă aleatoriu).
Vectorul de puteri aleatorii va avea exponenții puterilor de factori primi cu care numerele de bază vor fi înmulțite sau împărțite.

Se separă procedura de înmulțire de cea de împărțire (sunt apelate în funcție de variabila de discriminare, care arată dacă se înmulțește sau se împarte).
sumInt-ul se poate actualiza (în vectorul-copie sumIntMan care trebuie re-copiat, dacă se vizitează un factor prim de mai multe ori pe aceeași ramură, înmulțire/împărțire).

divInt = 729, sumInt = 1093.
Suma divizorilor care aparțin strict de un factor prim al numărului mare se numește sumă parțială (de exemplu numărul se împarte la 11 de 3 ori, atunci suma parțială este 1 + 11 + 121 + 1331 = 1464).
Sau de 6 ori la 3: atunci suma parțială este 1093, care mai este și număr prim.
Elementele vectorului sumInt sunt astfel de sume, care însă sunt mai mici de 2^64.

SUM (copia sumei numărului, suma mare) trebuie împărțit la o sumă parțială, când se face o substituție/înnoire de putere de factor prim. sumInt[i] este suma mică sau parțială, în vectorul sumInt. De asemenea, copia SUM trebuie înmulțită cu suma parțială înnoită.

Se împarte numărul (NUM, copia lui) la 3^2. SUM (în copie) se împarte la 1093, noul divInt e 729/9=81, sumInt = 1093/9 = 121, SUM *= 121.
Se înmulțește cu 3^1, atunci SUM se împarte la 121, noul divInt e 81*3=243, sumInt = 121 + 243 = 364, SUM *= 364.
Se împarte la 3^3 (iarăși se găsește 3), SUM /= 364, noul divInt să fie 243/27=9, sumInt = 364/27 = 13, SUM *= 13.

Se înțelege că așa, nu este corect să se folosească vectorii originali de sumInt și divInt, ai vectorului de bază, din cauza situației de după prima vizitare a lui 3; ci cei schimbați (copiile de manevră).
Înseamnă că trebuiesc vectori de sumInt și divInt de manevră, dacă vrem mai multe rânduri de substituție pe un același număr de bază, și la începerea fiecărui rând, copiile după sumInt și divInt să se umple cu originalul, la fel copie după NUM și SUM-ul de bază (ele oricum trebuiesc). Precis vor fi mai multe rânduri de substituție pe același număr.

Ca să nu, trebuie ca la o încărcare a mulInt și impInt, să nu intre doi factori primi identici în cei doi vectori (chiar și dacă unul într-un vector, celălalt în al doilea vector). Dacă mulInt are 3 elemente și impInt are două, cei 5 factori primi să fie diferiți. Verificarea aceasta scoate din schemă nevoia de copSumInt și copDivInt.

Până la urmă copSumInt și celălalt, copDivInt, nici nu au mai existat, ba și divInt a fost scos din mai multe surse. Dar la FACTORSUB(M) divInt trebuie să se afle, fiind folosit.

(va urma)

Comentarii

Postări populare