Cryptography 密码系统素数的辅助查找

Cryptography 密码系统素数的辅助查找,cryptography,primes,Cryptography,Primes,我是一名大学生,有一项作业要求寻找大素数。教授给了我下面的“简单”算法来寻找2个可能的素数 生成随机a和p,其中1

我是一名大学生,有一项作业要求寻找大素数。教授给了我下面的“简单”算法来寻找2个可能的素数

  • 生成随机a和p,其中1
  • 确认gcd(a,p)为=1——假设这将删除Carmichael数字编辑(意味着等于1)
  • 执行“模幂运算” 如果x^(p-1)%p=1,其中x从零开始,递增至p-1 对于p和a
  • 第三步的示例

    假设p=5

    1^4%5=1

    2^4%5=1

    3^4%5=1

    4^4%5=1

    这表明5是素数


    通过这次作业,我意识到计算素数绝非玩笑。我看到的上述算法的问题是,如果我猜测大数并用模幂运算测试它们,我可能会尝试将大数提升为大数。这使我产生了怀疑。我也研究过确定性有限自动机和埃拉托斯提尼筛。有人对改进给定的算法或提供任何帮助有什么建议吗?谢谢您的时间。

    不久前,我用C#编写了一些函数供个人使用。我希望这对你有好处

    公共长tmp; public long[]tabnum=新长[1]

    公共无效初始值(长数值) { 长时间休息; 长里索

     // 2 is only number pair prime
     tabnum[0] = 2;
    
     for (tmp = 3; tmp <= NUM; tmp++)
     {
         if ((tmp % 2) == 0) continue;// if num it's pair is not prime
    
         for (long Y = 0; Y < tmp; Y++)
         {
              riso = Math.DivRem(tabnum[Y], tmp, out Resto);
              if (Resto == 0) break;
              if(riso <= tabnum[Y]) 
              {
                     Array.Resize(ref tabnum, tabnum.Length + 1);
                     tabnum[tabnum.Length - 1] = tmp;
                     List1.Items.Add(tmp.ToString("###,###"));
                     break;
               } 
          }
      }
    
    //2是唯一的数对素数
    tabnum[0]=2;
    
    对于(tmp=3;tmp而言,您所遵循的算法称为。但是,您的解释存在几个问题:

    • 你说“确认gcd(a,p)小于1”。这没有意义,因为gcd永远不会小于1。你可以检查的是gcd(a,p)==1。如果它不是1,那么p不是素数。这可以检测卡迈克尔数,但这样做的机会很小

    • 测试的方法是,对于p的某个值,你选取a的几个随机值,并检查a^(p-1)%p==1。如果其中一个值不是1,那么p就不是素数。你选取的a值越多,你的精确度就越好

    • 您当然不能像您所说的那样检查x的所有值,因为要检查的值太多了

    • 有一种快速执行模幂运算的方法,即使对于大的基数和指数也是如此。请参阅。您仍然需要一种方法来对大整数执行乘法和模幂运算

    • Eratosthenes筛只对寻找小素数有用

    • 此测试可能会错误地确定Carmichael数是素数。其他算法(如)不存在此问题

      • 用C#表示有点简单。我不知道它的速度是否会更快

        bool IsPrime(long n)
            {
                if (n == 1)
                {
                    return false;
                }
        
                if (n < 4)
                {
                    return true;
                }
        
                if ((n % 2) == 0)
                {
                    return false;
                }
        
                if (n < 9)
                {
                    return true;
                }
        
                if ((n % 3) == 0)
                {
                    return false;
                }
        
                long r = (long)Math.Floor(Math.Sqrt(n));
                long f = 5;
                while (f <= r)
                {
                    if ((n % f) == 0)
                    {
                        return false;
                    }
        
                    if ((n % (f + 2)) == 0)
                    {
                        return false;
                    }
        
                    f += 6;
                }
        
                return true;
            }
        
        bool IsPrime(长n)
        {
        如果(n==1)
        {
        返回false;
        }
        if(n<4)
        {
        返回true;
        }
        如果((n%2)=0)
        {
        返回false;
        }
        if(n<9)
        {
        返回true;
        }
        如果((n%3)==0)
        {
        返回false;
        }
        long r=(long)Math.Floor(Math.Sqrt(n));
        长f=5;
        
        虽然(f)这对于寻找密码学所需规模的大素数没有用处。比另一个更糟。“比另一个更糟”。Thanx,但有效。这对大数不合适,我知道。你有其他最好的算法吗?:)-1:考虑到他们需要大素数,以及教授建议使用随机算法,这是完全不切实际的。-1:除了long中低端的数字外,它不会更快,而且不会回答问题,因为作业不允许选择较慢但更简单的算法测试。白痴:修改很简单格雷格:OP从来没有提到不能使用不同的算法。(但就像我说的,我不知道上面的算法有多高效。)Bignum类不是这里的问题。对于加密所需大小的素数,您可以让它运行数百万年,但它仍然不会返回。即使您将
        long
        替换为
        bitineger
        也没有用。对于非常小的素数,例如2^256,这需要大约2^128次迭代,这将花费非常长的时间。I与检测其他至少有3个素数因子的复合非卡迈克尔数相比,gcd测试无法更好地检测卡迈克尔数。它只是随机寻找公因子。由于gcd(a,p)!=1意味着a^(p-1)%p!=1,因此完全没有必要检查gcd(a,p)==1。如果您确实在寻找卡迈克尔数字,则可能必须进行此测试。
        bool IsPrime(long n)
            {
                if (n == 1)
                {
                    return false;
                }
        
                if (n < 4)
                {
                    return true;
                }
        
                if ((n % 2) == 0)
                {
                    return false;
                }
        
                if (n < 9)
                {
                    return true;
                }
        
                if ((n % 3) == 0)
                {
                    return false;
                }
        
                long r = (long)Math.Floor(Math.Sqrt(n));
                long f = 5;
                while (f <= r)
                {
                    if ((n % f) == 0)
                    {
                        return false;
                    }
        
                    if ((n % (f + 2)) == 0)
                    {
                        return false;
                    }
        
                    f += 6;
                }
        
                return true;
            }