Python:每日一题 116
本帖最后由 冬雪雪冬 于 2017-10-26 21:59 编辑先我们的玩法做了一下改变:
1. 楼主不再提供答案。
2. 请大家先独立思考”,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。
题目:
输入一个正整数n,建立一个有n个元素的列表,列表中的元素为4个质数之和,第0元素为第一个质数到第四个质素之和(2+3+5+7),第1个元素为第二个质数到第五个质素之和(3+5+7+11),第2个元素为第三个质数到第六个质素之和(5+7+11+13),以此类推。
int1 = int(input('输入一个正整数:'))
list1 = []
list2 = []
def is_prime(x):
if x == 1:
return ''
for i in range(2, x):
if x % i == 0:
return ''
return x
for y in range(2,9999):
if y == is_prime(y):
list2.append(y)
for n in range(int1):
element = list2 + list2 + list2 + list2
list1.append(element)
print(list1)
本帖最后由 aegis1417 于 2017-10-25 10:13 编辑
#新手來試看看,鞭策小力一點
times=0
number=2#從2開始
count=1#已包含2這個質數
p=
key=int(input("請輸入n = "))
k=key+3
answer=[]
while count < k:
times=0
number=number+1
for i in range(2,number):
if number%i ==0:
times=1
if times==1:
break
if times == 0:
count=count+1
p.append(number)
if len(p) == 4:
answer.append(sum(p))
del p
print(answer)
本帖最后由 BngThea 于 2017-10-25 10:36 编辑
from math import sqrt
tar = int(input("Please enter a integer:"))
tarList = []
primeList =
def check(n):
if not (n % 2):
return False
i = 3
while (i <= sqrt(n)):
if not (n % i):
return False
i += 2
return True
temp = 11
count = len(primeList) - 3
while count < tar:
if check(temp):
primeList.append(temp)
count += 1
temp += 2
for k in range(tar):
tarList.append(sum(primeList))
print(tarList) def gen_primes(n):
primes =
p = 7
while len(primes)<n+3:
p+=2
for i in range(3,int(p**0.5+1)):
if p%i==0: break
else:
primes.append(p)
return ) for i in range(n)]
def is_prime(n):
for i in range(2,n):
if n % i == 0:
return False
return True
def prime_list(n):
prime =
a = 3
while n:
a += 2
if is_prime(a):
prime.append(a)
if len(prime) == (n + 4):
break
return prime
def result_list(n):
prime = prime_list(n)
return ) for i in range(n)]
print(result_list(5)) def isprime(num):
if num == 0 or num == 1:
return False
elif num == 2 or num == 3:
return True
else:
for i in range(2,num//2 + 1):
if num % i == 0:
return False
return True
def generate_primes(n):
primes = []
num = 2
while len(primes) < n:
if isprime(num):
primes.append(num)
num += 1
else:
num += 1
return primes
def generate_prime_sum_list(n):
result = []
primes = generate_primes(n + 3)
for i in range(n):
result.append(sum(primes))
return result
print(generate_prime_sum_list(2))
print(generate_prime_sum_list(10))
本帖最后由 colinshi 于 2017-10-27 10:30 编辑
修改一下提高一下效率def FindZS(x,zs):#一个数(N)不能被小于根号N的数整除,那么这个数就是质数。
for j in zs:
if j > x**0.5:#所以当除数大于根号N的数时,跳出循环
break
if x%j == 0: #余数为0时,这个数就是合数返回False
return False
return True
#返回X以内的质数列表,6N±1法则
def zhisu(a):
z =
for i in range(6,a*a,6):
if FindZS(i-1,z) is True:
z.append(i-1)
if len(z) >= a:
return z
if FindZS(i+1,z) is True:
z.append(i+1)
if len(z) >= a:
return z
a=int(input('输入一个正整数:',))
b=zhisu(a+4)
print(b)
c=[]
import time
start=time.time()
for i in range(a):
c.append(sum(b))
print(c)
print(time.time()-start) 本帖最后由 SixPy 于 2017-10-25 16:29 编辑
http://www.lfd.uci.edu/~gohlke/pythonlibs/#gmpy
在此地址下载合适版本的 gmpy2 安装包
然后 pip install gmpy2的全路径安装包
gmpy2 是个开源,高效的,高精度大整数计算工具包。
它里面实现了很多种高效的素数测试方法。例如:
gmpy2.is_prime(536870911)
#False
本题用 next_prime
from gmpy2 import next_prime
def prm_sum(n):
prms =
for i in range(1,n+3):
prms.append(next_prime(prms[-1]))
return ))for i in range(n)]
print(prm_sum(4))
# 本帖最后由 SixPy 于 2017-10-25 16:40 编辑
素性测试算法——AKS算法
由三个印裔的哥们设计的(算法的名称取自他们的首字母)。
中文翻译:多项式时间内的素性确定算法
https://www.zybuluo.com/devilogic/note/131413
把源码也抄一份过来~
#!/usr/bin/python
# coding:utf-8
#import numpy as np
import math
import ysym
from ysym.ypolynomial import *
import gmpy2
def is_prime_by_AKS(n):
"""
使用AKS算法确定n是否是一个素数
True:n是素数
False:n是合数
"""
def __is_integer__(n):
"""
判断一个数是否是整数
"""
i = int(n)
f = n - i
return not f
def __phi__(n):
"""
欧拉函数,测试小于n并与n互素的个数
"""
res = n
a = n
for i in range(2, a+1):
if a % i == 0:
res = res // i * (i - 1)
while a % i == 0:
a //= i
if a > 1:
res = res // a * (a - 1)
return res
def __gcd__(a, b):
"""
计算a b的最大公约数
"""
if b == 0:
return a
return __gcd__(b, a % b)
print("步骤1, 确定%d是否是纯次幂" % n)
for b in range(2, math.floor(math.log2(n))+1):
a = n**(1/b)
if __is_integer__(a):
return False
print("步骤2,找到一个最小的r,符合o_r(%d) > (log%d)^2" % (n, n))
maxk = math.floor(math.log2(n)**2)
maxr = max(3, math.ceil(math.log2(n)**5))
nextR = True
r = 0
for r in range(2, maxr):
if nextR == False:
break
nextR = False
for k in range(1, maxk+1):
if nextR == True:
break
nextR = (gmpy2.mpz(n**k % r) == 0) or (gmpy2.mpz(n**k % r) == 1)
r = r - 1 # 循环多增加了一层
print("r = %d" % r)
print("步骤3,如果 1 < gcd(a, %d) < %d,对于一些 a <= %d, 输出合数" % (n, n, r))
for a in range(r, 1, -1):
g = __gcd__(a, n)
if g > 1 and g < n:
return False
print("步骤4,如果n=%d <= r=%d,输出素数" % (n, r))
if n <= r:
return True
print("步骤5")
print("遍历a从1到\sqrt{\phi(r=%d)}logn=%d" % (r, n))
print("如果(X+a)^%d != X^%d+a mod {X^%d-1, %d}$输出合数" % (n, n, r, n))
# 构造P = (X+a)^n mod (X^r-1)
print("构造多项式(X+a)^%d,并且进行二项式展开" % n)
X = multi_ysymbols('X')
a = multi_ysymbols('a')
X_a_n_expand = binomial_expand(ypolynomial1(X, a), n)
print(X_a_n_expand)
X.pow(r)
reduce_poly = ypolynomial1(X, ysymbol(value=-1.0))
print("构造消减多项式 %s" % reduce_poly)
print("进行运算 (X+a)^%d mod (X^%d-1)" % (n, r))
r_equ = ypolynomial_mod(X_a_n_expand, reduce_poly)
print("得到余式: %s" % r_equ)
print("进行运算'余式' mod %d 得到式(A)" % n)
A = ypolynomial_reduce(r_equ, n)
print("A = %s" % A)
print("B = x^%d+a mod x^%d-1" % (n, r))
B = ypolynomial1(multi_ysymbols('X', power=31), a)
B = ypolynomial_mod(B, reduce_poly)
print("B = %s" % B)
C = ypolynomial_sub(A, B)
print("C = A - B = %s" % C)
maxa = math.floor(math.sqrt(__phi__(r)) * math.log2(n))
print("遍历a = 1 to %d" % maxa)
print("检查每个'%s = 0 (mod %d)'" % (C, n))
for a in range(1, maxa+1):
print("检查a = %d" % a)
C.set_variables_value(a=a)
v = C.eval()
if v % n != 0:
return False
print("步骤6 输出素数")
return True
if __name__ == "__main__":
n = 31
print("检查'%d'是否为素数" % n)
result = is_prime_by_AKS(n)
if result is True:
print("YES")
else:
print("NO")
else:
pass 学习中 本帖最后由 口可口可 于 2017-10-27 11:31 编辑
重新修改一下,并优化了计算
list = []
prime_list =
n = int(input("输入质数和的个数:"))
i=1
while (n+3) > len(prime_list):
i+=2
for j in range(3,int(i**0.5+1)):
if (i % j ==0):break
else:
prime_list.append(i)
for a in range(n):
list.append(sum(prime_list))
print(list)
print(prime_list)
本帖最后由 wc365 于 2017-10-26 18:47 编辑
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n**0.5+1)):
if n%i == 0:
return False
return True
def primesum(n):
x = 2
primelist = []
while (n + 3)!= 0:
if is_prime(x):
primelist.append(x)
n -= 1
x += 1
else:
x += 1
return list(map(lambda a,b,c,d:a+b+c+d,primelist[:-3],primelist,primelist,primelist)) 获取n+3个素数,然后前n个每相邻4个求和
def fun(n):
prime_nums, num = , 7
while len(prime_nums) < n + 3:
for i in range(2, int(num**0.5) +1):
if not num % i: break
else:
prime_nums.append(num)
num += 2 # 偶数不用考虑了
return ) for i in range(n)] 本帖最后由 JonTargaryen 于 2017-10-28 20:00 编辑
首先输入n,然后返回前n+3个素数
然后每四个相加后,附加到新的列表中
素数:
建立素数列表:第一个为2,第二个是3
在3的基础上每次➕2,如果能够整除已有列表中的任意元素,继续+2,否则为素数,添加到列表中
import math
def all_prime(n):
primes =
temp = 3
is_prime = 1
num = 1
while num < n:
for each in primes:
if temp % each == 0:
is_prime = 0
break
if is_prime:
primes.append(temp)
num += 1
else:
is_prime = 1
temp += 2
return primes
def main():
n = int(input("please input the length: "))
primes = all_prime(n+3)
result = []
for i in range(n):
result.append(sum(primes))
print(result)
if __name__ == "__main__":
main()
受教了{:10_256:} def isPrime(n): #判断是否是素数
if n < 2:
return False
elif n == 2:
return True
else:
for i in range(2, int(n**0.5)+1):
if n % i == 0:
return False
return True
def getPrimeList(n): # 求n+3个素数
primeList = []
number = 1
while len(primeList) < n + 3:
if isPrime(number):
primeList.append(number)
number += 1
return primeList
def getList(n): # 求所求列表
return ) for i in range(n)]
print(getList(3))
# Result: def is_prime(x):
for i in range(2,x):
if x%i ==0:
return False
return True
n=int(input('please enter the value of n:'))
prime_count=[]
prime=[]
for i in range(2,10000):
if is_prime(i)==True:
prime.append(i)
for i in range(n):
count=prime+prime+prime+prime
prime_count.append(count)
print(prime_count) jerryxjr1220 发表于 2017-10-25 15:02
跪拜大佬 import math
from math import factorial
def prime(x):
returnfactorial(x-1) % x == x-1
def prime_list(n):
prime_list = []
for i in range(2,10*n):
if prime(i):
prime_list.append(i)
print(prime_list)
list1 = []
for i in range(n):
list1.append(sum(prime_list))
return list1
prime_list(10)
页:
[1]
2