Fermat 的因式分解方法可以直接求出PQ的距离,值得学习。
#include <stdio.h>
#include <math.h>
int n;
int tmp;
int ponySqrt(int x){
if(x<=0) return -1;
return (int)sqrt(x)*(int)sqrt(x)==x? (int)sqrt(x):-1;
}
void fermat(long long int n){
while(n%2==0){
n/=2;
printf("*2");
}
for(int i=(int)sqrt(n);;++i){
tmp=ponySqrt(i*i-n);
//printf("%d + %d = %d\n",tmp,i,i+tmp);
if(tmp!=-1){
printf("%d*%d",i+tmp,i-tmp);
n/=(i+tmp);
n/=(i-tmp);
if(n<=1) break;
i=(int)sqrt(n);
}
}
}
int main()
{
long long int n = 70191551;
printf("n = %lld\n",n);
fermat(n);
return 0;
}