Square long Factor for long long int not working

时间:2017-06-12 19:54:56

标签: c++ prime-factoring

我正在尝试解决一个编程问题,我必须计算任何整数的素数因子分解,最大为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。再次感谢。

0 个答案:

没有答案