判断大数是否是素数问题

判断一个素数的方法首先要从素数的定义来看,一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。来自百度百科。这就可以看出我们要判断是否素数只要for(2<= i < num), if num%2 == 0. return it is a primer number. otherwise it is a composite number.

附上简单code. 

def isPrimer(num):
	for i in range(2, int(math.sqrt(num)) + 1):
		if num % i == 0:
			return False
		return True
PS:当然这里没有做关于1和2的判断。


下面我们来讨论对于大数的素数判断问题。何为大数1233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333332222222222222222222222222222222如果我们对于上面的数字的math.sqrt()做循环运算,看起来不是一个好主意。这里我们就要祭出今天的一个主要话题,当然这个要回归到数学问题了。费马小定理【对于任意的a<p 如果a^(p-1)=1(mod p)成立,那么我们认为p是一个素数】。可以找一些例子来验证:

2^2 = 1(mod 3) yes. so 3 primer number.

2^3 = 1(mode 4) error. so 4 is composite number

2^4 = 1(mode 5) yes. so 5 is primer number

那么我们似乎只要套用一下这个公式就可以了。no。求一个2^p当p足够大的时候,这里似乎比上面的循环更加可怕。但是有了幂模运算,这个问题有可以得到解决:

(a^b)%c = ((a%c)^b)%c.

这样我们的问题就可以简单的解决了

  another code with c sharp;

 static int GetMod(int a, int b, int n)
        {
            int ret = 1;
            while (0 != b--)
            {
                ret = a * ret % n;
            }
            return ret;
        }

if 上面的function return 1. so it is a primer. otherwise it is a composite number.


ok, 通过这些我们完成了一个数字的素数判断。 看起来还是很有意思的。嘎嘎、




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值