Allora ti consiglio:
1) limitati a numeri inferiori a 2^64 (1.8 *10^19). Il numero che hai scritto e' 2*10^18 e va bene
2) implementa la fattorizzazione in C, e crea una DLL
3) usa JNA (Java Native Access) per accedere alla DLL. JNA ti permette di evitare di scornarti con JNI (Java Native Interface), con un minuscolo overhead
A questo punto la fattorizzazione puo' essere implementata in modo decisamente efficiente in C usando un
long int, un intero a 64 bit.
Puoi usare diverse strategie:
1) la prima e' usare un vettore di primi precablato nel codice. Ad esempio puoi usare un vettore con 1000/10.000 elementi
https://www.mathsisfun.com/numbers/prime-number-lists.html
2) se il numeo e' inferiore a 2^32, puoi usare il bruteforce
3) infine, puoi implementare, o trovare del codice gia' pronto, per ulteriori algoritmi di fattorizzazione
ecc..
Ovviamente, se implementi gli algoritmi di fattorizzazione, devi implementare anche degli algoritmi per i test di primalita'!
Bel progetto .