【问题标题】:Lehmann algorithm doesn't make sense莱曼算法没有意义
【发布时间】:2014-05-25 09:35:57
【问题描述】:

我尝试实施 Lehmann 测试,但第一次无法正常工作。我按照大家的描述进行了

  1. 计算 r = [ a^( (p -1) / 2) ] mod p
  2. 如果 r 不是 1 或 –1,那么 p 肯定不是素数。
  3. 如果 r = 1 或 –1,p 不是素数的可能性最多为 50%。

无论我怎么做,它都不会奏效。我什至尝试过硬编码

p = 7; //definitely a prime number

double e = (p - 1 )/2;

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

cout << f <<endl;

而 f 最终为 6

任何帮助将不胜感激

【问题讨论】:

  • 正如@dciriello 所说,6 = -1 (mod 7)。您还必须检查f-p == -1

标签: c++ rsa number-theory


【解决方案1】:

通过计算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 % b就是a,也就是说,如果a = -1 mod b,那么a % b == a

英文条件f % p != 1 &amp;&amp; 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大很多。

【讨论】:

  • 你的工作,但是当我将 p 增加到 10861(也是一个素数)时,它失败了。有什么办法解决这个问题吗?
  • 除非您使用库来准确表示数字,否则它会溢出。 3^(10860/2) 远远超过 2^64 - 1,这是 int 中可表示的最大数。甚至大于 2^256 - 1,这是我所知道的任何架构上可以本地表示的最大 int。您需要一个用于大量数据的库。我经常使用GMP。它有一个很好的 C++ 包装库。或者,您可以使用具有内置任意精度整数的语言,例如 python。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2020-12-31
    • 1970-01-01
    • 2013-07-03
    • 2017-06-05
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    相关资源
    最近更新 更多