Для начала вы можете использовать бинарный поиск, легко реализовать let:
x
будь твоим старшим
n
n-я степень, которую вы хотите проверить
поэтому вы хотите проверить, есть ли y
такое, что y^n=x
и для начала предполагают x>=0
Алгоритм выглядит следующим образом:
первое вычисление y
предела ymax
Я бы использовал 2^(log2(x)/n)
, это число с (bits used for x)/n
, поэтому ymax^n
имеет такое же количество битов, как x
. Итак, сначала посчитайте биты x
, а затем разделите их на n
.
for (ymax=1,i=1;i<=x;i<<=1) ymax++; ymax=(ymax/n);
теперь ymax
- это количество бит, y
необходимо проверить до
поиск по корзине
for(m=1<<ymax,y=0;m;m>>=1)
{
y|=m;
if (integer_pow(y,n)>x) y^=m;
}
return (integer_pow(y,n)==x);
integer_pow(y,n)
может выполняться с помощью двоичного питания или с помощью одиночного цикла for для малых n
добавить обработку знака
если (x<0)
, то n
, очевидно, должно быть нечетным, а y<0
поэтому, если не вернуть false, иначе отрицать x
, а также окончательный y
результат.
[edit1] Вот простой пример C ++:
bool is_root(DWORD &y,DWORD x,DWORD n) // y=x^(1/n) return true if perfect nth root
{
DWORD i,p,m; y=x;
if (n==0) { y=0; return (x==0); }
if (n==1) { y=x; return (x!=0); }
for (i=1,m=1;m<x;i++,m<<=1); m=1<<(i/n); // compute the y limit
for (y=0;m;m>>=1) // bin search through y
{
y|=m;
for (p=y,i=1;i<n;i++) p*=y; // p=y^n
if (p>x) y^=m; // this is xor not power!!!
}
for (p=y,i=1;i<n;i++) p*=y; // p=y^n
return (p==x);
}
поэтому просто преобразуйте DWORD
в свой тип данных bigint, как видите, вам нужны только базовые арифметические и битовые операции, такие как +,<,==,<<,>>,|,^
(последнее - XOR, а не мощность)
Есть также другие возможности сделать это для некоторого вдохновения, проверьте это (и все там подссылки):
Так, например, вы можете даже избавиться от *
операций (как я сделал в подссылке 16T sqrt, представленной в одной из подссылок (заголовок: ... только один цикл)), что является огромным ускорением для bigints.
person
Spektre
schedule
16.06.2015
n
th, потому что вам нужно это значение, или вам просто нужно знать, идеальная ли это сила? - person rgettman   schedule 15.06.2015BigInteger
. - person Louis Wasserman   schedule 15.06.2015