# 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
# 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
815

被折叠的 条评论
为什么被折叠?



