# coding:utf-8 # 1素数(质数)指的是不能被分解的数,除了1和它自己以外就没有其余数可以整除。 #求100之内的全部素数。 def isPrimeNumber(n): p = 2;q = n;a = [] while p<=q:if n%p ==0: a.append(p) break p += 1 q = n/p if len(a) ==0: #print "%d 是素数"%n return n for i in range(2,20): isPrimeNumber(i) '''2 .若两个素数之差为2,则这两个素数就是孪生素数。 编写程序找出1~100之间的全部孪生素数。''' mat = [] for i in range(2,100000): n = isPrimeNumber(i) if n not in [None] :mat.append(n) for j in range(len(mat)-1): if mat[j+1] - mat[j] ==2: print mat[j],mat[j+1] '''3. 某古寺的一块石碑上依稀刻有一些神秘的天然数。专家研究发现:这些数是由1,3,5,7,9 这5个奇数字排列组成的5位素数,同时去掉它的最高位与最低位数字后的3位数仍是素数, 同时去掉它的高二位与低二位数字后的一位数仍是素数。所以人们把这些神秘的素数称为金蝉素数, 喻意金蝉脱壳以后仍为美丽的金蝉。试求出石碑上的金蝉素数。''' prime3 = [] for i in range(101,1000): n = isPrimeNumber(i) if n not in [None] :prime3.append(n) prime1 = [2,3,5,7] #产生排列组合的数字 from itertools import permutations for p in permutations([1,3,5,7,9], 5): num1 = p[1]*100 + p[2]*10 +p[3] num2 = p[2] if (num1 in prime3) and (num2 in prime1): print p '''4.编写程序找出1~900之间的全部可逆素数(可逆素数是指一个素数的各位 数值顺序颠倒后获得的数仍为素数,如11三、311)。 ''' for i in range(2,100000): n = isPrimeNumber(i) if n not in [None]: if len(str(n)) == 2: z = list(str(n)) num = int(z[1]) * 10 +int(z[0]) m = isPrimeNumber(num) if m not in [None]:print "%d是可逆素数"%n else: for p in permutations(list(str(n)),3): num = int(p[0]) *100 + int(p[1])*10 + int(p[2]) m = isPrimeNumber(num) if m not in [None]:print "%d是可逆素数"%n ;break '''5. 所谓回文素数是指,对一个整数n从左向右和从右向左读结果值相同且是素数,即称为回文素数。 求不超过1000的回文素数。''' getprime = [] for i in range(11,1000): n = isPrimeNumber(i) if n not in [None]:getprime.append(n) for j in getprime: k = list(str(j)) z = '' for p in k[-1:-len(k)-1:-1]: z = z+p if int(z) in getprime:print j '''素数的平方是回文,好比11*11=121。 求不超过1000的平方回文素数。''' for j in range(4,1000): n = isPrimeNumber(j) if n not in [None]: n = n**2 k = list(str(n)) z = '' for p in k[-1:-len(k)-1:-1]: z = z+p if n==int(z):print j '''法国数学家梅森尼对这类形如2^n-1的素数特别感兴趣,作过不少有意义的工做,后人把此类数 命名为梅森尼数。已经证实了,若是2^n-1是素数,则幂指数n必须是素数,然而,反过来并不对, 当n是素数时,2^n-1不必定是素数。例如,人们已经找出2^11-1是一个合数,23能够除尽它,2^23-1 是一个合数,47能够除尽它。编程找出指数n在(2,50)中的梅森尼数。 ''' for i in range(2,51): j = 2**i -1 n = isPrimeNumber(j) if n not in [None]: m = isPrimeNumber(i) if m not in [None]: print j '''众所周知,哥德巴赫猜测的证实是一个世界性的数学难题,至今未能彻底解决。我国著名数学家陈景润为哥德巴赫猜测的证实做出过杰出的贡献。 所谓哥德巴赫猜测是说任何一个大于2的偶数都能表示成为两个素数之和。 编写程序,验证指定范围内哥德巴赫猜测的正确性,也就是近似证实哥德巴赫猜测。''' #1000之内的素数 import random mat = [2] for i in range(2,100000): n = isPrimeNumber(i) if n not in [None]:mat.append(n) for i in range(1000): index1 = int(random.uniform(0,len(mat))) index2 = int(random.uniform(0,len(mat))) Sum = mat[index1] + mat[index2] if Sum%2 ==0:print 'True' ''' 相似七、3七、6七、9七、10七、13七、16七、197,这样由素数组成的数列叫作等差素数数列。 素数数列具备项数的限制,通常指素数数列的项数有多少个连续项,最多能够存在多少个连续项。 编程找出100之内的等差素数数列''' # 解题步骤: # 1. 筛法找到100全部素数 # 2. 对于素数list内素有俩两组合,构造等差数列a0, a1项 # 3. 计算出a2, 查表判断a2是不是素数,是素数则能构成素数等差序列, 计算a3... def findAllPrime(n): pt = [True] * n prime = [] for p in range(2, n): if not pt[p]: continue prime.append(p) for i in range(p * p, n, p): pt[i] = False return prime, pt prime, pt = findAllPrime(100) print prime for i in range(len(prime)): for j in range(i + 1, len(prime)): a0, a1 = prime[i], prime[j] an = a1 + a1 - a0 s = [] while an < 100 and pt[an]: s.append(an) an += a1 - a0 if s: print [a0, a1] + s