C'è una soluzione matematica che trova a e b veloce anche per valori elevati di c. Sfortunatamente, non è così semplice. Sto cercando di dare una breve spiegazione dell'algoritmo. Spero non sia troppo confuso.
Poiché c è dato e siete alla ricerca di A e B, che, fondamentalmente, vuole risolvere Diophantine equazioni della forma
n=x^2+y^2,
in cui è dato n. Non aiuta molto che n = c * c sia un quadrato e quindi sto descrivendo una soluzione per ogni n. Se n fosse un numero primo, potresti usare Fermat's theorem, per decidere se l'equazione è risolvibile e usarla, come ha fatto notare l'algoritmo Hermite-Serret per trovare le soluzioni se ce ne sono.
Per risolvere il caso in cui n non è primo, è una buona idea usare Gaussian integers. (Gli interi gaussiani sono solo numeri complessi con coefficienti integrali). In particolare si nota che la norma di x + yi è
N(x+yi) = x^2+y^2.
Quindi si deve trovare l'interi di Gauss x + yi la cui norma è n. Poiché la norma è moltiplicativa è sufficiente risolvere questa equazione per i fattori di n e quindi moltiplicare gli interi gaussiani delle equazioni individuali. Lasciatemi fare un esempio. Vogliamo risolvere
65 = x^2 + y^2.
Ciò equivale a trovare x, y tali che
N(x+yi) = 65
nel corso degli interi di Gauss. Noi fattore 65 = 5 * 13, quindi usiamo Fermat per notare che sia 5 e 13 può essere rappresentato come somma di due quadrati. Infine, troviamo sia utilizzando la forza bruta del utilizzando l'algoritmo di Hermite-Serret
N(2+i) = N(1+2i) = ... = 5
N(2+3i) = N(3+2i) = ... = 13
nota, ho lasciato fuori gli interi gaussion 2-i, -2 + i, ecc con coefficienti negativi. Anche queste sono soluzioni.
Quindi possiamo ora moltiplicare queste soluzioni insieme per ottenere
65 = 5 * 13 = N (2 + i) * N (2 + 3i) = N ((2 + i) * (2 + 3i)) = N (1 + 8i)
e
65 = 5 * 13 = N (2 + i) * N (3 + 2i) = N ((2 + i) * (3 + 2i)) = N (4 + 7i).
Quindi, si ottiene i due soluzioni
1*1 + 8*8 = 65
4*4 + 7*7 = 65
Le altre combinazioni esempio con coefficienti negativi devono essere controllati anche. Non danno nuove soluzioni oltre alle permutazioni e ai segni modificati.
Per calcolare tutte le soluzioni si potrebbe anche aggiungere che non è necessario calcolare mai c * c. Trovare i fattori di c è tutto ciò che è necessario. Inoltre, poiché a e b sono entrambi più piccoli di c, non succederà che i prodotti di interi gaussiani non siano rappresentabili con i coefficienti integer a 64 bit. Quindi, se si presta attenzione, i numeri a 64 bit sono abbastanza precisi per risolvere il problema. Certo, è sempre più facile usare solo un linguaggio come Python che non ha questo tipo di problemi di overflow.
Solo per aggiungere a questo: Per calcolare i fattori gaussiani dei numeri primi della forma 4n + 1, utilizzare l'algoritmo Hermite-Serret. I numeri di coda 4n + 3 sono primi gaussiani, quindi non c'è più bisogno di fattorizzarli. –
Sì, davvero. Molte grazie. Ho aggiunto l'algoritmo di Hermite-Serret alla mia risposta. – Accipitridae