120 likes | 258 Views
La fattorizzazione con le equazioni di grado >= 2. Di Cristiano Armellini cristiano.armellini@alice.it. L’impostazione. Supponiamo che p = a b (a, b primi) sia il numero da fattorizzare e che i fattori si possano scrivere nella forma: x(x^2+b) = p
E N D
La fattorizzazione con le equazioni di grado >= 2 Di Cristiano Armellini cristiano.armellini@alice.it
L’impostazione • Supponiamo che p = a b (a, b primi) sia il numero da fattorizzare e che i fattori si possano scrivere nella forma: x(x^2+b) = p • Dove b è evidentemente un numero pari positivo o negativo • Ovvero: x^3+bx-p=0 • Le equazioni fino al quarto grado possono essere sempre risolte per via algebricae dalla formula risolutiva possiamo dedurre condizioni per b.
L’algoritmo • x^3+bx-p=0 • Si fissa un b intero (positivo o negativo) • Si risolve l’equazione di III grado e si vede se ha soluzioni intere. In caso positivo trovato x, trovata la soluzione: un fattore sarà x, l’altro x^2+b • In caso contrario si passa al valore di b pari successivo ecc
I vantaggi • Il metodo è vantaggioso quando i due fattori pur grandi non hanno lo stesso numero di cifre e sono parecchio di stanti tra loro. • Il metodo può essere generalizzato considerando l’equazione x^n+bx = p, ovvero x(x^(n-1) + b) = P per n > 3, tuttavia è possibile risolvere per via algebrica solo le equazioni con grado < 5.
Una possibile semplificazione • Se x(x^2+a) = p, x^3+ax = p • a = (p-x^3)/x con a intero positivo o negativo • Quindi: se a positivo x < p ^ (1/3), se a negativo x > p ^ (1/3) • In generale a = (p- x ^ n)/x • Facendo variare x (x intero) intorno a p ^ (1/3) o nel caso generale p ^ (1/n) trovo l’x tale che a è intero quindi ho trovato la fattorizzazione
Un altro caso molto interessante • Se p = (2m+1)(2n+1) • 2n = p/(2m+1) – 1 (*) • Per cui per la positività del fattori dovrà essere m < (p-1)/2 • Parto da m < (p-1)/2, decremento m fino a che non trovo per n un valore intero in (*), quindi ho completato la fattorizzazione perché conosco m, n, quindi anche 2m+1, 2n+1 • Analogamente nel casi per cui p = (2m-1)(2n-1), p = (2m+1)(2n-1)
Codice (esempio) #include <iostream> #include <stdlib.h> usingnamespacestd; intmain(intargc, char*argv[]) { double p, m, n; long i = 0; cout << "inserisci il numero da fattorizzare "; cin >> p; m = int((p-1)/2); n = (p/(2*m+1) -1)*0.5; do{ m = m-1; i = i+1; n = (p/(2*m+1) -1)*0.5; } while (n != int(n)); cout << 2*m+1 << " \n"; cout << 2*n+1 << " \n"; cout << i <<"\n"; system("PAUSE"); return 0; }
Un tuffo alla Fermat (variante) • p = x^2-y^2 = ( x - y)(x + y) • y = x + d, sostituendo ho • d^2 + 2xd + p = 0 • d = -x +/- Sqrt(x^2-p), x > Sqrt(p) • Analogamente se x = y + d ho che d^2+2yd-p=0 • E se y = x-d ho che d^2+2yd+p=0 • E se x = y-d ho che d^2-2yd-p=0
Codice Fermat – primo caso #include <iostream> #include <stdlib.h> #include <math.h> usingnamespacestd; intmain(intargc, char*argv[]) { double p, m, n, d, x, y; long i = 0; cout << "inserisci il numero da fattorizzare "; cin >> p; x = int(sqrt(p)); d = -x + sqrt(pow(x,2)-p); do{ i = i+1; x = x+1; d = -x + sqrt(pow(x,2)-p); } while (d != int(d)); y = x+d; cout << x - y<< " \n"; cout << x + y << " \n"; cout << i <<"\n"; system("PAUSE"); return 0; }
Codice Fermat in PARI/GP {trovato(p) = local(i, x, d, y); x = floor(sqrt(p)); d = -x +sqrt(abs(x^2-p)); while ( d != floor(d), x = x+1; d = -x +sqrt(abs(x^2-p))); y = x+d; print(x-y); print(x+y); }
nota • Da d^2+2xd+p=0 • x = (d^2+p)/(2d) • Faccio variare d e vedo quando x è intero • Quindi …. Il codice in C++ potrebbe diventare…
Codice alternativo #include <iostream> #include <stdlib.h> #include <math.h> usingnamespacestd; intmain(intargc, char*argv[]) { double x, y, d, p; cout << "inserisci il numero da fattorizzare "; cin >> p; d = 1; x = (pow(d,2)+p)/(2*d); do{ d = d+1; x = (pow(d,2)+p)/(2*d); } while (x != int(x)); y = x-d; cout << x-y << "\n"; cout << x+y << "\n"; system("PAUSE"); return 0; }