素数测试

欧几里得算法

输入:m,n
输出:m和n的最大公约数
步骤:
1. 如果 n=0 ,返回 m 的值作为结果,结束。否则进入2;
2. 计算m/n, 将余数赋值给r。
3. 将n的值赋值给m,将r的值赋值给n, 返回第一步。
其实这里的思想十分清晰,被除数与除数的最大公约数等于除数与余数的最大公约数。

实际上根据上面的描述我们将代码写成递归形式:

int Euclid_gcd(int m, int n){
    if (n == 0) return m;
    return Euclid_gcd(n, m % n);
}

也可以写成递推形式

int Euclid_gcd1(int m, int n){
    while (n != 0){
        int r = m % n;
        m = n;
        n = r;
    }
    return m;
}

素数测试1

如果两个整数相乘为N,则必有一个数小于等于N
所以我们只需要测试:

for i in range(2,sqrt(n)+1):
   remain = N % i
   if(remain==0):
      return not prime
return prime

素数测试2

公式:
if:

x(modN)=x(modN)y(modN)=y(modN)

then:
x+y(modN)=x+y(modN)xy(modN)=xy(modN)

假设 p 是一个素数,1<=a<p,可以得到 {1,2,3,4,.......,p1} mod p的值就是 {1,2,3,4,.......,p1} ,而 {a,2a,3a,4a,.......,(p1)a} mod p的值也在 {1,2,3,4,.......,p1} ,理由如下:如果上面(p-1)个有两个数的余数相等,设为 n m且( n>m ),那么n和m,就需要满足 nm=kp ,(k为大于0的整数),同时由于 n=k1a,m=k2a ,所以 nm=k3a ,所以我们就可以得出 kp=k3a ,从而推出 p=k3ka ,(不管怎样都可以分解成两个整数相乘)从这里可以推出p可以由两个整数相乘可以,而 p 是素数,这与条件不符,所以不存在两个余数相等的数,所以{a,2a,3a,4a,.......,(p1)a}中每一个的余数不相同。根据两个组数同余,那么两组数的乘数也是同余。

(p1)!=ap1(p1)!modp1=ap1modp

上面就推出了费马小定理。
所以我们判定一个数是不是素数,只需要选择一个 a ,然后看ap1的模是不是1,如果不是1,说明是合数,但是是1,也不能说它就是素数(少量的合数也满足上述公式),所以为了筛出合数,我们一般会选择几个 a <script type="math/tex" id="MathJax-Element-6328">a</script>.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值