Как взять числа из списка .txt и сохранить результат в другом .txt? - PullRequest
0 голосов
/ 09 февраля 2020

Этот скрипт имеет формулу, в которой в начале установлены числа x1 и x2 в коде, и мне нужно изменить код так, чтобы значение x1 взято из списка предварительно подготовленного текстового документа. Например, из документа: 'List.txt'

То есть получается, что мне нужно ввести:

with open ("List.txt '", "r") as f:

на место значения x1 = 6 в коде. Но как это систематизировать? Просто не очень богаты знаниями Python.

Список номеров:

1
4
2
15
6
8
13
3
12
5
10
7
14
9
11

Код: (Powered by Python 2.7)

import sys

a=0
b=7
p=37

x1=6
x2=8

if (len(sys.argv)>1):
    x1=int(sys.argv[1])
if (len(sys.argv)>2):
    x2=int(sys.argv[2])
if (len(sys.argv)>3):
    p=int(sys.argv[3])
if (len(sys.argv)>4):
    a=int(sys.argv[4])
if (len(sys.argv)>5):
    b=int(sys.argv[5])


def modular_sqrt(a, p):
    """ Find a quadratic residue (mod p) of 'a'. p
        must be an odd prime.

        Solve the congruence of the form:
            x^2 = a (mod p)
        And returns x. Note that p - x is also a root.

        0 is returned is no square root exists for
        these a and p.

        The Tonelli-Shanks algorithm is used (except
        for some simple cases in which the solution
        is known from an identity). This algorithm
        runs in polynomial time (unless the
        generalized Riemann hypothesis is false).
    """
    # Simple cases
    #

    if legendre_symbol(a, p) != 1:
        return 0
    elif a == 0:
        return 0
    elif p == 2:
        return p
    elif p % 4 == 3:
        return pow(a, (p + 1) / 4, p)

    # Partition p-1 to s * 2^e for an odd s (i.e.
    # reduce all the powers of 2 from p-1)
    #
    s = p - 1
    e = 0
    while s % 2 == 0:
        s /= 2
        e += 1

    # Find some 'n' with a legendre symbol n|p = -1.
    # Shouldn't take long.
    #
    n = 2
    while legendre_symbol(n, p) != -1:
        n += 1

    x = pow(a, (s + 1) / 2, p)
    b = pow(a, s, p)
    g = pow(n, s, p)
    r = e

    while True:
        t = b
        m = 0
        for m in xrange(r):
            if t == 1:
                break
            t = pow(t, 2, p)

        if m == 0:
            return x

        gs = pow(g, 2 ** (r - m - 1), p)
        g = (gs * gs) % p
        x = (x * gs) % p
        b = (b * g) % p
        r = m


def legendre_symbol(a, p):
    """ Compute the Legendre symbol a|p using
        Euler's criterion. p is a prime, a is
        relatively prime to p (if p divides
        a, then a|p = 0)


        Returns 1 if a has a square root modulo
        p, -1 otherwise.
    """
    ls = pow(a, (p - 1) / 2, p)
    return -1 if ls == p - 1 else ls

def egcd(a, b):
    if a == 0:
        return (b, 0, 1)
    else:
        g, y, x = egcd(b % a, a)
        return (g, x - (b // a) * y, y)

def modinv(a, m):
    g, x, y = egcd(a, m)
    if g != 1:
        print ("x")
    else: 
       return x % m


print "a=",a
print "b=",b
print "p=",p

print "x-point=",x1
print "x-point=",x2


z=(x1**3 + a*x1 +b) % p
y1=modular_sqrt(z, p)

z=(x2**3 + a*x2 +b) % p
y2=modular_sqrt(z, p)

print "\nP1\t(%d,%d)" % (x1,y1)
print "P2\t(%d,%d)" % (x2,y2)



s=((-y2)-y1)* modinv(x2-x1,p) 

x3=(s**2-x2-x1) % p

y3=((s*(x2-x3)+y2)) % p

result =  "Q\t(%d,%d)" % (x3,y3)
f = open('Result01.txt', 'w')
f.write(result)
f.close()

Ранее я видел сценарии, в которых числа взяты из одного текстового документа, выполняют функцию, а результат сохраняется в другом текстовом документе.

Ответы [ 3 ]

0 голосов
/ 09 февраля 2020

Хотя вы жестко кодируете значения x1, x2 в своем коде, их можно переопределить, как вы делаете здесь:

if (len(sys.argv)>1):
    x1=int(sys.argv[1])
if (len(sys.argv)>2):
    x2=int(sys.argv[2])

Так что, если вы вызываете свой скрипт из командной строки Как и C:\Users\test.py x1value x2value, вы можете переопределить x1 и x2. Если вы действительно хотите, чтобы текстовый файл содержал ваши x1 и x2, просто используйте следующий фрагмент где-то вверху

import json
with open("input.json","r",encoding="utf-8") as stream:
    parsed = json.load(stream)
    x1,x2 = parsed["x1"],parsed["x2"]

Содержимое «input. json»:

{"x1":1,"x2"=2}
0 голосов
/ 09 февраля 2020

Имея только python без дополнительных зависимостей, вы можете прочитать List.txt следующим образом:

with open("List.txt","r") as f:
    arrX1 = list(map(int,f.readlines()))

print (arrX1)

Вышеприведенное считывает все строки в f и преобразует / отображает их в целые числа. Затем функция list дает вам массив, через который вы можете l oop выполнить, чтобы сгенерировать x2 и записать в файл Result.txt.

Приведенные выше отпечатки

[1, 4, 2, 15 , 6, 8, 13, 5, 3, 10, 7, 14, 9, 11]

Таким образом, для вашего кода замените все строки со 125 вниз на

# Read numbers from file and put them in an array
with open("List.txt","r") as f:
    arrX1 = list(map(int,f.readlines()))
f.close()

# Open the result file to write to
f = open('Result01.txt', 'w')

# Now get x1 for each item in the list of numbers from the file
# then do the calculations
# and write the result
for x1 in arrX1:
    z=(x1**3 + a*x1 +b) % p
    y1=modular_sqrt(z, p)

    z=(x2**3 + a*x2 +b) % p
    y2=modular_sqrt(z, p)

    print "\nP1\t(%d,%d)" % (x1,y1)
    print "P2\t(%d,%d)" % (x2,y2)

    s=((-y2)-y1)* modinv(x2-x1,p) 

    x3=(s**2-x2-x1) % p

    y3=((s*(x2-x3)+y2)) % p

    result =  "Q\t(%d,%d)" % (x3,y3)
    f.write(result)

f.close()
0 голосов
/ 09 февраля 2020

Попробуйте использовать библиотеку pandas для чтения, обработки и записи своих чисел.

import pandas as pd    # import pandas module and call it pd for short
x2 = 6                 
df = pd.read_csv('input_file.txt')    # read the data from a text file into a dataframe
df['x1 times x2'] = df['x1'] * x2     # create new column in your dataframe with result of your function
df.to_csv('output_file.txt', index=False)    # output result of your calculations (dropping the dataframe index column)
...