Как повторить проверку состояния в python? - PullRequest
0 голосов
/ 11 ноября 2018

Следующая функция дает правильный результат для меня. Но для большого количества 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)

Ответы [ 3 ]

0 голосов
/ 11 ноября 2018
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
0 голосов
/ 11 ноября 2018

Похоже, что единственными переменными в вашем поколении q s являются целые числа, на которые вы умножаете 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
0 голосов
/ 11 ноября 2018

Ваш 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):
...