以下功能为我提供了正确的结果。但是对于大量的q,很难处理此程序。因此,我想通过循环或其他方式迭代q。我该怎么办?
def sgf(a): # here a is a list of two numbers
import random
a2=random.randint(1,1068)
p=1069
q1=(a[0]+a[1]*1+a2*1**2)%p
q2=(a[0]+a[1]*2+a2*2**2)%p
q3=(a[0]+a[1]*3+a2*3**2)%p
q4=(a[0]+a[1]*4+a2*4**2)%p
q5=(a[0]+a[1]*5+a2*5**2)%p
q6=(a[0]+a[1]*6+a2*6**2)%p
q7=(a[0]+a[1]*7+a2*7**2)%p
q8=(a[0]+a[1]*8+a2*8**2)%p
q9=(a[0]+a[1]*9+a2*9**2)%p
while ((q1>1060) or (q2>1060) or (q3>1060) or (q4>1060) or (q5>1060) or (q6>1060) or (q7>1060) or (q8>1060) or (q9>1060)):
a2=random.randint(1,1068)
q1=(a[0]+a[1]*1+a2*1**2)%p
q2=(a[0]+a[1]*2+a2*2**2)%p
q3=(a[0]+a[1]*3+a2*3**2)%p
q4=(a[0]+a[1]*4+a2*4**2)%p
q5=(a[0]+a[1]*5+a2*5**2)%p
q6=(a[0]+a[1]*6+a2*6**2)%p
q7=(a[0]+a[1]*7+a2*7**2)%p
q8=(a[0]+a[1]*8+a2*8**2)%p
q9=(a[0]+a[1]*9+a2*9**2)%p
if ((q1<=1060) and (q2<=1060) and (q3<=1060) and (q4<=1060) and (q5<=1060) and (q6<=1060) and (q7<=1060) and (q8<=1060) and (q9<=1060)):
break
return q1,q2,q3,q4,q5,q6,q7,q8,q9
为简单起见,
f(x)=(a0+a1*x+a2*x**2)%p
其中a0,a1在[0,1060]中,而a2从[0,1068]中随机选择
如果全部为f(x)<=1060
,则接受f(x),否则重新生成f(x)
答案 0 :(得分:3)
您的q
应该是一个列表。这样,您可以将for
与range
一起使用循环来执行计算:
for ind in range(len(q)):
q[ind]=(a[0]+a[1]*(ind + 1)+a2*(ind + 1)**2)%p
您也可以将条件表示为迭代,但是最简单的方法可能是使用any
函数并将条件写为生成器:
while any(qx > 1060 for qx in q):
答案 1 :(得分:1)
def sgf(a):
import random
a2=random.randint(1,1068)
p=1069
items = []
# if items is empty, or any element is greater than 1060, keep looping
while not items or any(item > 1060 for item in items):
items = [(a[0]+a[1]*i+a2*i**2)%p for i in range(1,10)]
return items
答案 2 :(得分:1)
看起来q
代中唯一的变量是a[1]
和a2
乘以的整数。
您可以更改函数以接受q
的总数作为第二个参数(例如total_q
),然后遍历range(1, total_q+1)
并附加每个新的q
到Python列表,最后返回列表。
尝试类似的方法:
def sgf(a, total_q):
import random
a2=random.randint(1,1068)
p=1069
q_list = []
for i in range(0,total_q+1):
q = (a[0]+a[1]*i+a2*i**2)%p
q_list.append(q)
while any(q > 1060 for q in q_list):
a2=random.randint(1,1068)
q_list = []
for i in range(0,total_q+1):
q =(a[0]+a[1]*i+a2*i**2)%p
q_list.append(q)
if all(q <= 1060 for q in q_list):
break
return q_list