, O(x) O(log(x)), , :
x^y = n // ^(1/y)
x = n^1/y
x = floor(pow(n,1/y))
n=400 y=5 :
x = floor(pow(400,1/5))
x = floor(pow(400,0.2))
x = floor(3.3144540173399868004685801443126)
x = 3
n . , , . :
[edit1]
:
n = < 1 , 10^10 >
y = < 1 , 10^5 >
no FPU just integer math
. ceil(log2(10^10))=34 bit 64- QWORD. , .
:
m = 2^33 = 1<<33 = 0x0000000200000000
pow, root , ++:
#define T_bits 34
#define T_MSB 0x0000000200000000
#define T QWORD
T pow(T x,T y) // power by squaring returns z=x^y where x>=0, y>=0
{
T i,z=1;
for (i=0;i<T_bits;i++) // test all bits from MSB to LSB
{
z*=z;
if (T(y&T_MSB)) z*=x;
y<<=1;
}
return z;
}
T bits(T x) // count how many bits is in x
{
T m=T_MSB,z=T_bits;
for (;m;m>>=1,z--)
if (x>=m) break;
return z;
}
T root(T x,T y) // bin search y-th root returns z=x^(1/y)
{
T m,z;
m=((bits(x)+y-1)/y); // ceil(bits(x)/y)
if (m) m=1<<m; else m=1; // MSB of the result for bin search 2^(ceil(bits(x)/y))
for (z=0;m;m>>=1) // test all bits of x from MSB to LSB
{
z|=m; // set actual bit
if (pow(z,y)>x) z^=m; // clear if result exceedes x
}
return z;
}
, 32- n<2^32 :
#define T_bits 32
#define T_MSB 0x80000000
#define T DWORD
, . T - T_MSB - MSB, T_bits - .
:
root(400,5);
3. ** pow, , **.
. x=1, x=2, x=3 .., x^y>=n, pow(n,1/y). n=10000, y=2, 100.
, . 10000 14 , ceil(14/y)=7, :
x with set bit| x^y | action
-------------------------------
0100 0000 bin | 4096 | none
0110 0000 bin | 9216 | none
0111 0000 bin | 12544 | clear
0110 1000 bin | 10816 | clear
0110 0100 bin | 10000 | none
0110 0010 bin | 10404 | clear
0110 0001 bin | 10201 | clear
-------------------------------
0110 0000 bin | 10000 | result
7 100.