判断大数是否是素数问题

判断一个素数的方法首先要从素数的定义来看,一个大于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

。可以找一些例子来验证:

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, 通过这些我们完成了一个数字的素数判断。 看起来还是很有意思的。嘎嘎、




你可能感兴趣的:(数据结构和算法)