趣味算法之趣味素数

# 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之间的所有可逆素数(可逆素数是指一个素数的各位
数值顺序颠倒后得到的数仍为素数,如113、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'
    
    
'''
类似7、37、67、97、107、137、167、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 
          
          
    
               
            
            
    
    
    
    
    



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值