Progresul algoritmic în vara anului 2014

(Plus o mică intercalație numerică)

 *
În ce situație 499 + 1401 = 2573?

499 din baza 16 este 1177, 1401 din baza 5 este 226, zecimal, firește, iar suma lor (1403) scrisă în octal este 2573.

Dar 507 + 415 = 3131?

507 din baza 16 este 1287, 415 din baza 9 este 338, iar suma 1625 în octal este 3131.

La RAPIDNUM trebuie folosit SUMADIV la ACTUALM; de la NUMERIC/NUMSIMPL nu este nevoie ca SUMADIV să fie refolosit la ACTUALM.

Când MODSPRIM înmulțește cu un număr prim numere nedivizibile cu acel factor sau le împarte la el pe cele o singură dată divizibile cu el (deci nedivizibile cu pătratul lui), el face ceea ce face NUMSIMPL.

Această funcționalitate se poate separa de MODSPRIM, care rămâne să înmulțească cu factorul prim numere de bază deja divizibile cu el (if mpz_divisible_ui_p) sau să le împartă la el pe cele divizibile mai mult de o dată cu el (deci divizibile sigur cu pătratul lui).
La MODSPRIM va fi făcut un vector nou cu pătratele factorilor primi încărcați, folosit când se face căutare în jos. Se modifică MODPRIMSUS(M) să nu mai ia cazul când numărul de bază nu se divide cu factorul prim.

De asemenea se va încerca implementarea la MODSPRIM a modificării mai directe a coeficientului de fracționare a abundenței, cu inspirare de la NUMSIMPL, scăzând gradul de operare cu mepezeteaua.
NUMSIMPL și MODSPRIM sunt modificatoarele de sumă care folosesc factori primi impari drept coeficienți de legătură. MODSPAR folosește coeficienți pari (inclusiv numărul prim 2), iar MODIFSUM coeficienți impari compuși (produse de numere prime impare).

MODMIN este frate mai mic pentru MODSPRIM (de vizat și el).

SUMRED, SUMM și NUMERIC calculează sumele de la zero, la fiecare număr obținut, ele nu calculează și nu schimbă sume de bază (pot să calculeze sumele de bază ale numerelor din GIG.TXT pentru a se asigura un grad mare de respectare a abundențelor, de către numerele de acolo, cu fișiere de numere prime adaptate intervalelor numerice de căutare (dar acum toate fișierele sunt mari, chiar și CF52.TXT are 1332 de factori, iar marele P2 are 5193 în loc de 5173, pe când și mai marele PRIME2 are 5321).

Intervalul CF52 înseamnă zona numerică naturală până la 10^52, CF80 cea până la 10^80 şi tot aşa.

MODSPRIM şi MODPRIM - separate, în MODPRIM fiind formule simplificate de stabilire a încadrării coeficientului de fracţionare a abundenţei în intervalul de deschidere.
Au fost făcute MODMSPAR, MODIFMSUM - variante limitate la CF52 pentru MODSPAR şi MODIFSUM.
MODMIN: varianta minimă (adică CF52) a lui MODPRIM.

NUMSIMPL, MODSPRIM, MODPRIM, MODIFSUM, MODMIN, MODIFMSUM, SUMRED, SUMM - la ACTUAL(M) s-ar putea lua din textele lor fără SUMADIV().

La MODPRIM, pentru siguranţă, funcţiile MODPRIMSUS şi MODPRIMSUM se pot folosi în CF100, maximum CF130, poate şi CF160, ca produsele din ele să rămână la 64 de biţi. ADPRIMDIV se foloseşte tot în CF160.
În special la coeficienţii de legătură precum 3, suspecţi să apară la puteri îndeajuns de mari încât să fie mai aproape de 2^64.

Dar MODPRIMSUS şi MODPRIMSUM pot fi folosite şi dincolo de CF160, când coeficienţii de legătură sigur nu apar la puteri prea mari.
Şi chiar şi MODSPRIMSUS şi MODSPRIMSUM, cu aceeaşi regulă (coeficienţi primi de legătură cu puteri mai mici, dincolo de zona cu 3, 5, 7, 19...). Cu atenţie.
La căutarea pe fond I se poate mai uşor folosi zona de coeficienţi primi cu puteri mai mari, coeficienţii de abundenţă fiind mai mici.

La FACTMSUB: multe operaţii cu mpz_t, şi mpz_gcd, şi mpz_divexact, mpz_mul, mpz_set_ui şi nu numai.

La substituirea cu modificarea coeficienţilor de fracţionare trebuie mai degrabă folosit mpz_t, când se apelează factori primi cu puteri mai mari (de bază + de substituţie), şi chiar mai mici, deci în general trebuie aşa, şi, valorile putând fi peste 64 de biţi şi zona din afara factorilor primi K fiind de altfel nesigură de a nu duce ea însăşi la astfel de valori, funcţiile de substituţie ce folosesc mpz_t nici nu trebuie să facă trunchiere cu mpz_get_ui(>64 de biţi), rezultatul unei asemenea operaţii fiind un neadevăr.

Aşadar, funcţiile de la FACTMSUB trebuie să substituie cu coeficienţi mpz_t pentru mai multă siguranţă.
Dar atunci nu ar fi o simplificare importantă a vitezei faţă de FACTORSUB(M) obişnuite, unde se modifică direct suma mpz_t, ci poate chiar ceva mai greu prin repetatele mpz_gcdm chiar fără mpz_divexact în unele situaţii.

LOTVECM & SUMADIV1;
LOTVECRED & NUMSUM1;
LOTVECRED & SM1.

Şi verificarea faptului că suma calculată este mai mare decât numărul (ca semn al faptului că s-au parcurs cu adevărat toţi divizorii primi ai numărului).

Comentarii

Postări populare