Есть 3 случая, о которых вы, возможно, задаете вопрос.
Случай 1: Вы просто заботитесь о большинстве значащих цифр
Используйте числа с плавающей запятой.Приведите все в double
-точное число с плавающей точкой, и оно должно быть примерно до 10 300 .
>>> 3 ** np.array([2, 10, 50, 100], dtype=np.float)
array([9.00000000e+00, 5.90490000e+04, 7.17897988e+23, 5.15377521e+47])
Если вы превышаете это значение, сохраняйте только логарифм чисели используйте соответствующую математику (добавление logs = умножение, умножение logs = возведение в степень), тогда вы будете в порядке до смехотворно больших чисел.
>>> math.log(3) * 50
54.93061443340549
>>> math.log(3) * 50 == math.log(3 ** 50) == math.log(717897987691852588770249)
True
Случай 2: Вы заботитесь только о минимум значащие цифры
Я думаю, это называется "конечное поле" или математика "Галуа"?Обычно используется в криптографии и других вещах.К сожалению, Numpy, похоже, не имеет функции power / modulo, так что вам нужно накатить свою собственную или попробовать обходной путь (те, которые там работают, только если он не переполняется в одной операции, поэтому может не сработать снова).
>>> [pow(3, n, 2 ** 16 + 1) for n in [2, 10, 50, 100]] # modulo some random prime
[9, 59049, 12911, 33330]
Случай 3: Вам нужно все цифры
Вы должны использовать математику 'bigint', которую Numpy не предоставляет,Целые числа Python - это легкий выбор.
>>> 3 ** np.array([2, 10, 50, 100], dtype=np.object)
array([9, 59049, 717897987691852588770249,
515377520732011331036461129765621272702107522001], dtype=object)