查找任何互质数字

时间:2013-07-31 11:43:37

标签: math numbers rsa

我正在尝试实现RSA以获得乐趣,但我仍然坚持你必须找到一个共同素数到n的部分(这是pxq,其中p和q是两个大素数)。

有没有办法做到这一点?我似乎找不到任何东西,除了我不需要的一个数字的副本数量。

3 个答案:

答案 0 :(得分:2)

任何两个均匀采样的整数是互质的概率是~60%

您可以简单地选择所需范围内的随机整数,并使用原始数字和循环(重新取样)测试其GCD(如果它们不是互质)。

答案 1 :(得分:1)

我们只关注模数 n 的残差,因此它们有 n 。只有当 p q (或两者)的倍数时,残留才与 n 不共同。

p 残基是 q 的倍数, q 它们是 p 的倍数,其中一个它们(零)都是,所以有 p + q -1个残基不与 n 共同构成,所以随机的几率不是共质子的残基(选自均匀分布)正好是1 / p + 1 / q -1 -1 /(pq)。由于 p q 在实际使用中非常庞大(而不是课堂练习),因此找到非共同素数的机会微不足道。这也意味着你已经破解了这个 n 的加密,因为除零之外的任何非共同素数都可以让你轻松找到 p q < / em>的。 (应用欧几里德算法找到最大公约数。它是 p q 。)

顺便提一下,你应该期望这在你的生命中不会偶然发生,所以没有办法测试处理意外找到非共同素数的代码路径,除非通过人为构建要测试的数字或通过对 p q 使用非常小的数字(在这种情况下,测试是不足的,因为它无法在此代码路径上对大数字进行算术运算)。实际上没有必要测试这个或包含代码来处理这种情况,因为计算机破坏的可能性要大于实际(巨大的) p 的情况。 q

答案 2 :(得分:0)

#include <stdio.h>  
 int gcd(int a,int b)  
{  
  int temp;  
  while(b!=0)  
  {  
       temp=a;  
       a=b;  
       b=temp%b;  
  }  
  return a;  
   }  
   int main()  
    {  
  int n,i,d,count;  
  count=1;  
  scanf("%d",&n);  
  for(i=2;i<n;i++)  
  {  
       d=gcd(n,i);  
       if(d==1)  
            count+=1;  
  }  
  printf("%d\n",count);  
  return 0;  
        }