Как исправить неправильные вычисления в Python Mode for Processing? - PullRequest
3 голосов
/ 11 апреля 2019

Я пытаюсь реализовать наглядную иллюстрацию треугольника Паскаля с помощью Python Mode for Processing для MAC OS X. Одним из необходимых шагов, конечно, является вычисление биномиальных коэффициентов в каждой строке треугольника.Я решил сделать это рекурсивным способом вместо вычисления факториалов.Мой код хорошо работает в Jupyter, но приводит к другим результатам в обработке.Кто-нибудь знает, почему и как я могу решить проблему?

rows = 301

pascal=[[1], [1,1]]
for i in range (rows):
    last_row = pascal[len(pascal)-1]
    next_row = [1] +[last_row[i]+last_row[i+1] for i in range(len(last_row)) if i < len(last_row)-1] +[1]
    pascal.append(next_row)

print (pascal[35][16])

Код выдает правильные результаты при выполнении в Jupyter, но имеет другие результаты при обработке.Проблемы начинаются в строке 35 треугольника (отсчет начинается с 0).16-й элемент в этой строке должен быть 4059928950, но при обработке вычисляется -235038346.И с тех пор вычисления в Processing, похоже, часто оказываются неверными.

1 Ответ

1 голос
/ 12 апреля 2019

Наиболее принципиальным подходом было бы найти большую целочисленную библиотеку, которую вы можете вызвать из Jython, но так как все, что вам нужно, это сложение, то легко написать свою собственную функцию, которая будет принимать два базовых 10 строковых представления натуральных чисел ивернуть строковое представление их суммы:

rows = 301

def add_nums(s1,s2):
    #reverse strings and 0-pad to be of the same length
    s1 = s1[::-1]
    s2 = s2[::-1]
    s1 += '0'*(max(len(s1),len(s2)) - len(s1))
    s2 += '0'*(max(len(s1),len(s2)) - len(s2))
    dsum = []
    c = 0 #carry
    for d1,d2 in zip(s1,s2):
        a,b = int(d1), int(d2)
        c,r = divmod(a+b+c,10) 
        dsum.append(str(r))
    if c > 0: dsum.append('1')
    return ''.join(reversed(dsum))

pascal=[['1'], ['1','1']]
for i in range (rows):
    last_row = pascal[len(pascal)-1]
    next_row = ['1'] +[add_nums(last_row[i],last_row[i+1]) for i in range(len(last_row)) if i < len(last_row)-1] +['1']
    pascal.append(next_row)

print (pascal[35][16]) #prints 4059928950
...