Почему Python плохо печатает огромное количество? - PullRequest
0 голосов
/ 12 апреля 2020

Добрый день. Я тестирую некоторые вещи с RSA в Python, и я нашел проблему, которую могу решить ... Я пробовал с Python 3.8.2 на Win10, а также с Python 3.7.7 на Linux.

Позволяет иметь число, например:

c1= 36251028222184669113487409017454975826565106104917435244458509025325597595097437837292486054294655693705631371301937875354932194238774646471806718003961847732817524682493697446263462385101163784046225206169381882321268194820701612704489320707217757417267296259559235617734319007884212443563740615946094992859

, что нечетно, и имеет некоторые делители, как число 3. Однако, используя python, следующий результат неверен:

>>> int(c1/3)
12083676074061555316246267430643464247176522791037114836775756754628361403915178709103046469098451026523530772272080775928995905537251905701994027100469698250900136798602107760548114248253333583378545153076020030263178871202026581924052160700631938491851060523788925385374271125821574344356121690982561349632   

Потому что четный, и потому что другой результат:

>>> c1-(c1/3)*3
4.9896007738368e+291    

Так что я, вероятно, что-то упускаю из-за огромных чисел в Python, но после при поиске в Google все, что появляется, говорит, что Python может обрабатывать длинные целые числа (например: Обработка очень больших чисел в Python)

Заранее спасибо

EDIT1: использование оператора // не работает ни один. С c1 // 3 он показывает нечетное число, но не с 1433, например:

>>> int(c1/1433)
25297298131322167445037545214187294306719866275723199239586371433276402101706584876000795120234021688465172586752437074519879774327812782348905848779769082172156601811448934599891376653705513433451245958986783036140639646619734644642118968668454860764517223706466696549981028176876987462015607168839974912

>>> int(c1//1433)
25297298131322169653515288916577094086926103353047756625581653192830144867479021519394616925537093994211885116051596563401906625428314477649551094210720061223180408012905580911558592034264594406173220660271724970217214371821843414308785290095755587869691065079943639649500571533764279444217544044623932304   

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

Вы можете использовать Python библиотека произвольной точности mpmath

from mpmath import mp, mpf
mp.dps = 310 # Used 310 since c1 has 308 digits

 # Float precise up to mp.dps digits
c1 = mpf(36251028222184669113487409017454975826565106104917435244458509025325597595097437837292486054294655693705631371301937875354932194238774646471806718003961847732817524682493697446263462385101163784046225206169381882321268194820701612704489320707217757417267296259559235617734319007884212443563740615946094992859)

Тест 1

print(int(c1/3))
Out: 
12083676074061556371162469672484991942188368701639145081486169675108532531699145945764162018098218564568543790433979291784977398079591548823935572667987282577605841560831232482087820795033721261348741735389793960773756064940233870901496440235739252472422432086519745205911439669294737481187913538648698330953

print(c1 - (c1/3)*3)
Out: 0.0

Тест 2

print(int(c1/1433))
Out: 25297298131322169653515288916577094086926103353047756625581653192830144867479021519394616925537093994211885116051596563401906625428314477649551094210720061223180408012905580911558592034264594406173220660271724970217214371821843414308785290095755587869691065079943639649500571533764279444217544044623932304

print(c1 - (c1/1433)*1433)
0.0
0 голосов
/ 12 апреля 2020

Я попробовал это, что, кажется, подтверждает, что c1 делится на 3:

c1 = 36251028222184669113487409017454975826565106104917435244458509025325597595097437837292486054294655693705631371301937875354932194238774646471806718003961847732817524682493697446263462385101163784046225206169381882321268194820701612704489320707217757417267296259559235617734319007884212443563740615946094992859
d1 = c1 // 3
print(d1)

r = c1 - (d1 * 3)
print(r)

Вывод:

12083676074061556371162469672484991942188368701639145081486169675108532531699145945764162018098218564568543790433979291784977398079591548823935572667987282577605841560831232482087820795033721261348741735389793960773756064940233870901496440235739252472422432086519745205911439669294737481187913538648698330953
0
...