莱曼算法没有意义

时间:2014-05-25 09:35:57

标签: c++ rsa number-theory

我尝试实施莱曼测试,但它第一次没有工作。我按照每个人的描述

  1. 计算r = [a ^((p -1)/ 2)] mod p
  2. 如果r不是1或-1,则p绝对不是素数。
  3. 如果r = 1或-1,p不是素数的可能性最多不超过50%。
  4. 无论我怎么做,它都无法奏效。我甚至尝试过编码

    p = 7; //definitely a prime number
    
    double e = (p - 1 )/2;
    
    int f = (int)pow(3, e) % p;
    
    cout << f <<endl;
    

    和f最终为6

    任何帮助将不胜感激

2 个答案:

答案 0 :(得分:5)

通过计算f,您已完成第1步,但您将省略第2步和第3步。

p = 7; //definitely a prime number

double e = (p - 1 )/2;

int f = (int)pow(3, e) % p;

// Step 2
if(f % p != 1 && f % p != p - 1)
    cout << p << " is definitely not prime." << endl;
else // If not step 2, then step 3
    cout << p << " has 50% probability of being prime." << endl;

运算符%是mod运算符。它减少左数字mod正确的数字。与10 % 8一样2。重要的是要注意,当左数是正数时,结果总是正数。因此,如果a = b - 1a % ba,也就是说a = -1 mod b,则为a % b == a

英语中的f % p != 1 && f % p != p - 1条件为(f % p not equal 1) AND (f % p not equal p - 1)

一个问题是大p会溢出。

如果您想避免使用bignum库,可以像这样定义自己的pow:

unsigned int my_pow(unsigned int base, unsigned int expon, unsigned int mod){
    unsigned int result = base;
    for(int i = 1;i < expon;i++)
        result = (result * base) % mod;
    return result
}

你会像int f = pow(3, e, p);一样使用它。我不确定当它会溢出时如何约束,但它会比正常pow大很多。

答案 1 :(得分:1)

f最终为6因为6等于-1 mod 7,希望它有所帮助。