我正在尝试解决一个编程问题,我必须计算任何整数的素数因子分解,最大为2 ^ 63-1(C ++中的long long int)。我使用Shank的Square形式分解(SQUFOF)来计算de除数,但问题是在某些情况下SQUFOF无法找到任何除数。这是用C ++实现的代码:
typedef unsigned long long int lli;
lli LLIMAX=9223372036854775807ULL;
lli mult[16]={1ULL,3ULL,5ULL,7ULL,11ULL,15ULL,21ULL,33ULL,35ULL,55ULL,77ULL,105ULL,165ULL,231ULL,385ULL,1155ULL};
lli SQUFOF( lli N ) {
lli D, Po, P, Pprev, Q, Qprev, q, b, r, s;
int L, B, i;
if (isSquare(N)) {
return (lli)round(sqrt((double)ni));
}
for (int k = 0; k < 16 && N <= LLIMAX/mult[k]; k++) {
D = mult[k]*N;
Po = Pprev = P = (lli)floor(sqrt((double)D));
Qprev = 1ULL;
Q = D - Po*Po;
if (Q==0LL) {return mult[k];}
L = 2 * ((int)floor(sqrt(2.0*round(sqrt((double)N)))));
B = 3 * L;
for (i = 2 ; i < B ; i++) {
b = (Po + P)/Q;
P = b*Q - P;
q = Q;
Q = Qprev + b*(Pprev - P);
if (!(i & 1) && isSquare(Q)) break;
Qprev = q;
Pprev = P;
};
if (i >= B) continue;
r = (lli)round(sqrt((double)Q));
b = (Po - P)/r;
Pprev = P = b*r + P;
Qprev = r;
Q = (D - Pprev*Pprev)/Qprev;
i = 0;
do {
b = (Po + P)/Q;
Pprev = P;
P = b*Q - P;
q = Q;
Q = Qprev + b*(Pprev - P);
Qprev = q;
i++;
} while (P != Pprev);
r = gcd(N, Qprev);
if (r != 1ULL && r != N) return r;
}
return 0ULL;
}
我使用确定性Miller-Rabin检验来确保在调用函数之前N不是素数。我想知道SQUFOF是否可以成功找到任何复合数最多2 ^ 63-1的非平凡因子,在这种情况下我想知道我的代码有什么问题。感谢。
编辑:我不需要在我的代码上找到任何错误,如果有人能够提供SQUFOF的C ++实现,并且能够成功提取最重要的2 ^ 63的整数的非平凡因子,那就足够了。 -1。再次感谢。