1 / 12

La fattorizzazione con le equazioni di grado >= 2

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

lassie
Download Presentation

La fattorizzazione con le equazioni di grado >= 2

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. La fattorizzazione con le equazioni di grado >= 2 Di Cristiano Armellini cristiano.armellini@alice.it

  2. 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.

  3. 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

  4. 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.

  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

  6. 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)

  7. 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; }

  8. 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

  9. 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; }

  10. 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); }

  11. 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…

  12. 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; }

More Related