c - 关于 C 代码和 Pollard 对数 rho 算法的问题

标签 c discrete-mathematics logarithm

这段代码是用 C 语言根据 pollard 的对数 rho 算法(来自 wiki)编写的。在此代码中,如果我输入 alpha=2、beta=5、N=1019,则必须返回 a=681、b=378、A=301、B=426 和 X=1019。但我运行它,我只得到正确的 X=1019,并且得到 (a,b,A,B)=(672,367,445,706)。你知道问题出在哪里吗?

wiki site

#include<stdio.h>
#include<math.h>

int alpha, beta, N;

void xab(int *x, int *a, int *b)
{
    switch(*x%3){
    case 0: *x=((*x)*(*x))%N;   *a=((*a)*2)%N;  *b=((*b)*2)%N;  break;
    case 1: *x=(alpha*(*x))%N;  *a=((*a)+1)%N;  break;
    case 2: *x=(beta*(*x))%N;   *b=((*b)+1)%N;  break;
    } 
}  

int main(void)
{    
    int x=1;    int a=0;    int b=0;
    int X=1;    int A=0;    int B=0;
    int i;

    scanf("%d %d %d", &alpha, &beta, &N);    

for(i=1;i<N;i++){
        printf("Code #%d\n", i);
        xab(&x,&a,&b);
        printf("x=%d a=%d b=%d\n", x, a, b);    
        xab(&X,&A,&B);  xab(&X,&A,&B);
        printf("X=%d A=%d B=%d\n\n", X, A, B);
        if(x==X) break;
    }
    return 0;
}

最佳答案

您没有正确复制new_xab函数。请注意,new_xab 函数同时使用 Nn,其中 N=1019n=1018。作为引用,以下是维基百科文章中的三行内容

case 0: x = x*x     % N;  a =  a*2  % n;  b =  b*2  % n;  break;
case 1: x = x*alpha % N;  a = (a+1) % n;                  break;
case 2: x = x*beta  % N;                  b = (b+1) % n;  break;

关于c - 关于 C 代码和 Pollard 对数 rho 算法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23624828/

相关文章:

python - 获取图中唯一状态的数量

algorithm - 在大稀疏矩阵中找到 "largest"稠密子矩阵

python - 以对数刻度计算值

c - 从 OpenSSL C API 访问客户端写入 key 和服务器写入 key

c - 将 glist 指针作为参数传递以反射(reflect)列表中的更改不起作用

c - 有没有办法强制将变量存储在 C 的缓存中?

C-在一定范围内具有x个因子的数字的数量

algorithm - 教师对 Josephus 排列的输出无法重现

python - 获取稀疏矩阵中每个元素的日志

Java:整数中最高1位的偏移量