我正在尝试实现RSA以获得乐趣,但我仍然坚持你必须找到一个共同素数到n的部分(这是pxq,其中p和q是两个大素数)。
有没有办法做到这一点?我似乎找不到任何东西,除了我不需要的一个数字的副本数量。
答案 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;
}