Как возвести в степень самым быстрым способом на 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 шт):
В вопросе не раскрыта проблема, чем не устраивают стандартные способы?
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
Давайте для начала проверим, что такое 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
Можно также вывести это число в файл. Только на экран - не нужно.