Как возвести в степень самым быстрым способом на Python

Я пытался возвести число в степень самым быстрым способом. В интернете я нашел, что это следует делать через numpy.power(), но когда я пытаюсь провернуть это с большими числами, то возникает проблема, что результат равняется 0 (нулю). Что делать в этой ситуации? Если кто-то знает еще более быстрый способ, буду благодарен

Код:

print(np.power(np.array(2, dtype=int), np.array(1000000, dtype=int)))

Результат:

0

Process finished with exit code 0

Ответы (2 шт):

Автор решения: Oopss

В вопросе не раскрыта проблема, чем не устраивают стандартные способы?

import time
b = 9999
p = 500
# 9999 в степени 500

b_time = time.time()
print(pow(b,p))
e_time = time.time()
print(e_time-b_time)

b_time = time.time()
print(b**p)
e_time = time.time()
print(e_time-b_time)

95122704627157561443294812328344788384965859010735775319935530454704255762401717865250788831647825358680452758817585887525507213451074546668883588225853340400677512814490114072551779908058229418251051333376924031130836752574060854717773311349685072025595954304899554866458296619988311471515924269914341495519671564383280600862677720589851446928994777178776229992752999048865690512725749471736851099214756768319883835096125949534863389654935590136977828853059549057386080497380286735099245023875235023337335242795645644170264404340631889798525116138622019867179787549828163248551663616392073890686682652212118890354052519824690001617333717421968208177399432067218074277055415984332881291719020810123058932614653864496225822543602421238804387928185512472444743663879768324543840850508431186558775439878126741006913407612271785293996225320095015172040990138769645476784234075206795969096889514782617750163712382947247168618335227764334915564235064422849023816253413536332237833138855861566298394878145012295688541076587434404027150858216834900920191212905147773246412521749074005365306947354008232207957022570811414684023601215741529374847095469718655094177834029379601083100513214853689680067028925072973167138862749622255796375476575991557637912702234309351104599227533777505206981489894148206341612554427174962092079802466655645102064726006484211568142101542936698719073438829939833783651227336656413697322011814009662198220765668180569367895954377735119046801008951923142535369200002550259808594415561658039038611906923600874197883412726816303729733612475738624463402173502673348247206350564835492551625565511436519698689136186842015662846515819183931975769327725725245182685592156793046762391333642870556859152167474236079117407852891673154126971648457476528807305550788754548078582477682800415616397869842856656048617984671316530623762512496200610760793071514211988640738834506879575047495347428169162689589675963023762690198588960583063855679120649131371833858985321202556970290541512474995000001
0.0
95122704627157561443294812328344788384965859010735775319935530454704255762401717865250788831647825358680452758817585887525507213451074546668883588225853340400677512814490114072551779908058229418251051333376924031130836752574060854717773311349685072025595954304899554866458296619988311471515924269914341495519671564383280600862677720589851446928994777178776229992752999048865690512725749471736851099214756768319883835096125949534863389654935590136977828853059549057386080497380286735099245023875235023337335242795645644170264404340631889798525116138622019867179787549828163248551663616392073890686682652212118890354052519824690001617333717421968208177399432067218074277055415984332881291719020810123058932614653864496225822543602421238804387928185512472444743663879768324543840850508431186558775439878126741006913407612271785293996225320095015172040990138769645476784234075206795969096889514782617750163712382947247168618335227764334915564235064422849023816253413536332237833138855861566298394878145012295688541076587434404027150858216834900920191212905147773246412521749074005365306947354008232207957022570811414684023601215741529374847095469718655094177834029379601083100513214853689680067028925072973167138862749622255796375476575991557637912702234309351104599227533777505206981489894148206341612554427174962092079802466655645102064726006484211568142101542936698719073438829939833783651227336656413697322011814009662198220765668180569367895954377735119046801008951923142535369200002550259808594415561658039038611906923600874197883412726816303729733612475738624463402173502673348247206350564835492551625565511436519698689136186842015662846515819183931975769327725725245182685592156793046762391333642870556859152167474236079117407852891673154126971648457476528807305550788754548078582477682800415616397869842856656048617984671316530623762512496200610760793071514211988640738834506879575047495347428169162689589675963023762690198588960583063855679120649131371833858985321202556970290541512474995000001
0.00099945068359375
→ Ссылка
Автор решения: CrazyElf

Давайте для начала проверим, что такое int, который вы указываете при создании массива, в представлении библиотеки Numpy:

print(np.array(2, dtype=int).dtype)

Вывод:

int32

Это всего лишь тип int32, которых хранит только 32 бита. Даже если бы это был беззнаковый тип (а это не так), он мог бы хранить числа только до 2**32 - 1. Кстати, проверим это:

for i in range(30, 33):
    print(i, np.power(np.array(2, dtype=int), np.array(i, dtype=int)))

Вывод:

30 1073741824
31 -2147483648
32 0

То есть не то, что 2 в степени 1_000_000, а даже 2 в степени 31 уже переполняется и получается отрицательное число, а уже в 32 степени переполняется полностью и получается 0. И дальше так и будет 0 до любой более высокой степени.

Максимальный целочисленный тип Numpy - это int64, т.е. в 2 раза больше разрядов, но тоже далеко до 1_000_000.

В Numpy используются типы чисел фиксированной ёмкости, поэтому он и может так быстро работать. В чистом Питоне же тип int потенциально бесконечный. Хотите вычислять большие степени - используйте чистый Питон. Вычисление произойдёт моментально. Но не вздумайте печатать результат. Он будет очень очень очень длинный и печататься будет очень долго. Но можно напечатать какой-то кусочек. Например, последние 6 цифр результата. И вычислить общее число десятичных цифр результата. Оно очень большое:

%time
import math

x = 2**1_000_000
print(x % 1_000_000)
print(round(math.log10(x)))

Вывод:

CPU times: total: 0 ns
Wall time: 0 ns
109376
301030

Можно также вывести это число в файл. Только на экран - не нужно.

→ Ссылка