趣味算法之趣味素数

# 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