Как исправить неправильные вычисления в режиме Python для обработки?

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

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 часто кажутся ошибочными.

Что такое «Обработка»? Причина ошибки в том, что Python допускает произвольно большие целые числа, тогда как кажется, что вы получаете переполнение с помощью «Обработки».

JohanL 11.04.2019 11:13

@JohanL Обработка — это гибкий программный блокнот и язык для обучения программированию. Читайте вики по тегу обработка!

Rabbid76 11.04.2019 11:18

Я думаю, что JohanL на правильном пути: AFAIK Python Mode использует Jython, так что это может быть переполнение типа java long

George Profenza 11.04.2019 11:22

@JohanL Processing — это среда разработки визуально ориентированных приложений (обработка.orgpy.processing.org).

Marcus 11.04.2019 11:24

Просто предположим, что если визуальный дисплей, который вы имеете в виду, представляет собой эффект, подобный треугольнику Серпинского, полученный путем взятия коэффициентов по модулю некоторого числа - включите модуль в расчеты, чтобы переполнение не было проблемой.

John Coleman 12.04.2019 01:49

@John Coleman Вы угадали правильно! :-) И ваше предложение действительно то, что я действительно сделал, чтобы избежать проблемы, но я также хотел бы отобразить биномиальные коэффициенты. И я еще не нашел обходного пути для целочисленного переполнения. Согласно отзыву одного из участников Python Mode for Processing, обработка поддерживает только целые числа Java.

Marcus 12.04.2019 14:04
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
6
127
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Наиболее принципиальным подходом было бы найти большую целочисленную библиотеку, которую вы можете вызвать из 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

Спасибо большое. Я реализовал ваш код, и он работает хорошо.

Marcus 13.04.2019 09:45

Другие вопросы по теме