content: /*
  This can be read as literate Haskell (temporarily `ln ../test/run/small-pow.mo ../test/run/small-pow.lhs`)
  
  > import Data.Bits
  > import Data.Word
  >
  > effbits :: FiniteBits a => a -> Int
  > effbits a = finiteBitSize a - countLeadingZeros (a `xor` (a `shiftL` 1))
  >
  > extremal :: FiniteBits a => Int -> [a]
  > extremal 0 = [zeroBits]
  > extremal 1 = [complement zeroBits]
  > extremal n = [complement zeroBits `shiftL` pred n, let max = complement zeroBits `shiftR` (finiteBitSize max - pred n) in max]
  >
  > asBigNum :: (Integral a, FiniteBits a) => a -> Integer
  > asBigNum a | a `testBit` 63 = - fromIntegral (complement a) - 1
  > asBigNum a = fromIntegral a
  >
  > showBig = show . asBigNum
  >
  > main = sequence_ [ putStrLn ("assert (" ++ showBig n ++ " ** " ++ show e ++ " == " ++ show n' ++ ");")
  >                  | b <- [0 .. 31], e <- [0 .. 31], b * e <= 65, n <- extremal b :: [Word64]
  >                  , let n' = asBigNum n ^ fromIntegral e ]
  
  */
  
  assert (0 ** 0 == 1);
  assert (0 ** 1 == 0);
  assert (0 ** 2 == 0);
  assert (0 ** 3 == 0);
  assert (0 ** 4 == 0);
  assert (0 ** 5 == 0);
  assert (0 ** 6 == 0);
  assert (0 ** 7 == 0);
  assert (0 ** 8 == 0);
  assert (0 ** 9 == 0);
  assert (0 ** 10 == 0);
  assert (0 ** 11 == 0);
  assert (0 ** 12 == 0);
  assert (0 ** 13 == 0);
  assert (0 ** 14 == 0);
  assert (0 ** 15 == 0);
  assert (0 ** 16 == 0);
  assert (0 ** 17 == 0);
  assert (0 ** 18 == 0);
  assert (0 ** 19 == 0);
  assert (0 ** 20 == 0);
  assert (0 ** 21 == 0);
  assert (0 ** 22 == 0);
  assert (0 ** 23 == 0);
  assert (0 ** 24 == 0);
  assert (0 ** 25 == 0);
  assert (0 ** 26 == 0);
  assert (0 ** 27 == 0);
  assert (0 ** 28 == 0);
  assert (0 ** 29 == 0);
  assert (0 ** 30 == 0);
  assert (0 ** 31 == 0);
  assert (-1 ** 0 == 1);
  assert (-1 ** 1 == -1);
  assert (-1 ** 2 == 1);
  assert (-1 ** 3 == -1);
  assert (-1 ** 4 == 1);
  assert (-1 ** 5 == -1);
  assert (-1 ** 6 == 1);
  assert (-1 ** 7 == -1);
  assert (-1 ** 8 == 1);
  assert (-1 ** 9 == -1);
  assert (-1 ** 10 == 1);
  assert (-1 ** 11 == -1);
  assert (-1 ** 12 == 1);
  assert (-1 ** 13 == -1);
  assert (-1 ** 14 == 1);
  assert (-1 ** 15 == -1);
  assert (-1 ** 16 == 1);
  assert (-1 ** 17 == -1);
  assert (-1 ** 18 == 1);
  assert (-1 ** 19 == -1);
  assert (-1 ** 20 == 1);
  assert (-1 ** 21 == -1);
  assert (-1 ** 22 == 1);
  assert (-1 ** 23 == -1);
  assert (-1 ** 24 == 1);
  assert (-1 ** 25 == -1);
  assert (-1 ** 26 == 1);
  assert (-1 ** 27 == -1);
  assert (-1 ** 28 == 1);
  assert (-1 ** 29 == -1);
  assert (-1 ** 30 == 1);
  assert (-1 ** 31 == -1);
  assert (-2 ** 0 == 1);
  assert (1 ** 0 == 1);
  assert (-2 ** 1 == -2);
  assert (1 ** 1 == 1);
  assert (-2 ** 2 == 4);
  assert (1 ** 2 == 1);
  assert (-2 ** 3 == -8);
  assert (1 ** 3 == 1);
  assert (-2 ** 4 == 16);
  assert (1 ** 4 == 1);
  assert (-2 ** 5 == -32);
  assert (1 ** 5 == 1);
  assert (-2 ** 6 == 64);
  assert (1 ** 6 == 1);
  assert (-2 ** 7 == -128);
  assert (1 ** 7 == 1);
  assert (-2 ** 8 == 256);
  assert (1 ** 8 == 1);
  assert (-2 ** 9 == -512);
  assert (1 ** 9 == 1);
  assert (-2 ** 10 == 1024);
  assert (1 ** 10 == 1);
  assert (-2 ** 11 == -2048);
  assert (1 ** 11 == 1);
  assert (-2 ** 12 == 4096);
  assert (1 ** 12 == 1);
  assert (-2 ** 13 == -8192);
  assert (1 ** 13 == 1);
  assert (-2 ** 14 == 16384);
  assert (1 ** 14 == 1);
  assert (-2 ** 15 == -32768);
  assert (1 ** 15 == 1);
  assert (-2 ** 16 == 65536);
  assert (1 ** 16 == 1);
  assert (-2 ** 17 == -131072);
  assert (1 ** 17 == 1);
  assert (-2 ** 18 == 262144);
  assert (1 ** 18 == 1);
  assert (-2 ** 19 == -524288);
  assert (1 ** 19 == 1);
  assert (-2 ** 20 == 1048576);
  assert (1 ** 20 == 1);
  assert (-2 ** 21 == -2097152);
  assert (1 ** 21 == 1);
  assert (-2 ** 22 == 4194304);
  assert (1 ** 22 == 1);
  assert (-2 ** 23 == -8388608);
  assert (1 ** 23 == 1);
  assert (-2 ** 24 == 16777216);
  assert (1 ** 24 == 1);
  assert (-2 ** 25 == -33554432);
  assert (1 ** 25 == 1);
  assert (-2 ** 26 == 67108864);
  assert (1 ** 26 == 1);
  assert (-2 ** 27 == -134217728);
  assert (1 ** 27 == 1);
  assert (-2 ** 28 == 268435456);
  assert (1 ** 28 == 1);
  assert (-2 ** 29 == -536870912);
  assert (1 ** 29 == 1);
  assert (-2 ** 30 == 1073741824);
  assert (1 ** 30 == 1);
  assert (-2 ** 31 == -2147483648);
  assert (1 ** 31 == 1);
  assert (-4 ** 0 == 1);
  assert (3 ** 0 == 1);
  assert (-4 ** 1 == -4);
  assert (3 ** 1 == 3);
  assert (-4 ** 2 == 16);
  assert (3 ** 2 == 9);
  assert (-4 ** 3 == -64);
  assert (3 ** 3 == 27);
  assert (-4 ** 4 == 256);
  assert (3 ** 4 == 81);
  assert (-4 ** 5 == -1024);
  assert (3 ** 5 == 243);
  assert (-4 ** 6 == 4096);
  assert (3 ** 6 == 729);
  assert (-4 ** 7 == -16384);
  assert (3 ** 7 == 2187);
  assert (-4 ** 8 == 65536);
  assert (3 ** 8 == 6561);
  assert (-4 ** 9 == -262144);
  assert (3 ** 9 == 19683);
  assert (-4 ** 10 == 1048576);
  assert (3 ** 10 == 59049);
  assert (-4 ** 11 == -4194304);
  assert (3 ** 11 == 177147);
  assert (-4 ** 12 == 16777216);
  assert (3 ** 12 == 531441);
  assert (-4 ** 13 == -67108864);
  assert (3 ** 13 == 1594323);
  assert (-4 ** 14 == 268435456);
  assert (3 ** 14 == 4782969);
  assert (-4 ** 15 == -1073741824);
  assert (3 ** 15 == 14348907);
  assert (-4 ** 16 == 4294967296);
  assert (3 ** 16 == 43046721);
  assert (-4 ** 17 == -17179869184);
  assert (3 ** 17 == 129140163);
  assert (-4 ** 18 == 68719476736);
  assert (3 ** 18 == 387420489);
  assert (-4 ** 19 == -274877906944);
  assert (3 ** 19 == 1162261467);
  assert (-4 ** 20 == 1099511627776);
  assert (3 ** 20 == 3486784401);
  assert (-4 ** 21 == -4398046511104);
  assert (3 ** 21 == 10460353203);
  assert (-8 ** 0 == 1);
  assert (7 ** 0 == 1);
  assert (-8 ** 1 == -8);
  assert (7 ** 1 == 7);
  assert (-8 ** 2 == 64);
  assert (7 ** 2 == 49);
  assert (-8 ** 3 == -512);
  assert (7 ** 3 == 343);
  assert (-8 ** 4 == 4096);
  assert (7 ** 4 == 2401);
  assert (-8 ** 5 == -32768);
  assert (7 ** 5 == 16807);
  assert (-8 ** 6 == 262144);
  assert (7 ** 6 == 117649);
  assert (-8 ** 7 == -2097152);
  assert (7 ** 7 == 823543);
  assert (-8 ** 8 == 16777216);
  assert (7 ** 8 == 5764801);
  assert (-8 ** 9 == -134217728);
  assert (7 ** 9 == 40353607);
  assert (-8 ** 10 == 1073741824);
  assert (7 ** 10 == 282475249);
  assert (-8 ** 11 == -8589934592);
  assert (7 ** 11 == 1977326743);
  assert (-8 ** 12 == 68719476736);
  assert (7 ** 12 == 13841287201);
  assert (-8 ** 13 == -549755813888);
  assert (7 ** 13 == 96889010407);
  assert (-8 ** 14 == 4398046511104);
  assert (7 ** 14 == 678223072849);
  assert (-8 ** 15 == -35184372088832);
  assert (7 ** 15 == 4747561509943);
  assert (-8 ** 16 == 281474976710656);
  assert (7 ** 16 == 33232930569601);
  assert (-16 ** 0 == 1);
  assert (15 ** 0 == 1);
  assert (-16 ** 1 == -16);
  assert (15 ** 1 == 15);
  assert (-16 ** 2 == 256);
  assert (15 ** 2 == 225);
  assert (-16 ** 3 == -4096);
  assert (15 ** 3 == 3375);
  assert (-16 ** 4 == 65536);
  assert (15 ** 4 == 50625);
  assert (-16 ** 5 == -1048576);
  assert (15 ** 5 == 759375);
  assert (-16 ** 6 == 16777216);
  assert (15 ** 6 == 11390625);
  assert (-16 ** 7 == -268435456);
  assert (15 ** 7 == 170859375);
  assert (-16 ** 8 == 4294967296);
  assert (15 ** 8 == 2562890625);
  assert (-16 ** 9 == -68719476736);
  assert (15 ** 9 == 38443359375);
  assert (-16 ** 10 == 1099511627776);
  assert (15 ** 10 == 576650390625);
  assert (-16 ** 11 == -17592186044416);
  assert (15 ** 11 == 8649755859375);
  assert (-16 ** 12 == 281474976710656);
  assert (15 ** 12 == 129746337890625);
  assert (-16 ** 13 == -4503599627370496);
  assert (15 ** 13 == 1946195068359375);
  assert (-32 ** 0 == 1);
  assert (31 ** 0 == 1);
  assert (-32 ** 1 == -32);
  assert (31 ** 1 == 31);
  assert (-32 ** 2 == 1024);
  assert (31 ** 2 == 961);
  assert (-32 ** 3 == -32768);
  assert (31 ** 3 == 29791);
  assert (-32 ** 4 == 1048576);
  assert (31 ** 4 == 923521);
  assert (-32 ** 5 == -33554432);
  assert (31 ** 5 == 28629151);
  assert (-32 ** 6 == 1073741824);
  assert (31 ** 6 == 887503681);
  assert (-32 ** 7 == -34359738368);
  assert (31 ** 7 == 27512614111);
  assert (-32 ** 8 == 1099511627776);
  assert (31 ** 8 == 852891037441);
  assert (-32 ** 9 == -35184372088832);
  assert (31 ** 9 == 26439622160671);
  assert (-32 ** 10 == 1125899906842624);
  assert (31 ** 10 == 819628286980801);
  assert (-64 ** 0 == 1);
  assert (63 ** 0 == 1);
  assert (-64 ** 1 == -64);
  assert (63 ** 1 == 63);
  assert (-64 ** 2 == 4096);
  assert (63 ** 2 == 3969);
  assert (-64 ** 3 == -262144);
  assert (63 ** 3 == 250047);
  assert (-64 ** 4 == 16777216);
  assert (63 ** 4 == 15752961);
  assert (-64 ** 5 == -1073741824);
  assert (63 ** 5 == 992436543);
  assert (-64 ** 6 == 68719476736);
  assert (63 ** 6 == 62523502209);
  assert (-64 ** 7 == -4398046511104);
  assert (63 ** 7 == 3938980639167);
  assert (-64 ** 8 == 281474976710656);
  assert (63 ** 8 == 248155780267521);
  assert (-64 ** 9 == -18014398509481984);
  assert (63 ** 9 == 15633814156853823);
  assert (-128 ** 0 == 1);
  assert (127 ** 0 == 1);
  assert (-128 ** 1 == -128);
  assert (127 ** 1 == 127);
  assert (-128 ** 2 == 16384);
  assert (127 ** 2 == 16129);
  assert (-128 ** 3 == -2097152);
  assert (127 ** 3 == 2048383);
  assert (-128 ** 4 == 268435456);
  assert (127 ** 4 == 260144641);
  assert (-128 ** 5 == -34359738368);
  assert (127 ** 5 == 33038369407);
  assert (-128 ** 6 == 4398046511104);
  assert (127 ** 6 == 4195872914689);
  assert (-128 ** 7 == -562949953421312);
  assert (127 ** 7 == 532875860165503);
  assert (-128 ** 8 == 72057594037927936);
  assert (127 ** 8 == 67675234241018881);
  assert (-256 ** 0 == 1);
  assert (255 ** 0 == 1);
  assert (-256 ** 1 == -256);
  assert (255 ** 1 == 255);
  assert (-256 ** 2 == 65536);
  assert (255 ** 2 == 65025);
  assert (-256 ** 3 == -16777216);
  assert (255 ** 3 == 16581375);
  assert (-256 ** 4 == 4294967296);
  assert (255 ** 4 == 4228250625);
  assert (-256 ** 5 == -1099511627776);
  assert (255 ** 5 == 1078203909375);
  assert (-256 ** 6 == 281474976710656);
  assert (255 ** 6 == 274941996890625);
  assert (-256 ** 7 == -72057594037927936);
  assert (255 ** 7 == 70110209207109375);
  assert (-512 ** 0 == 1);
  assert (511 ** 0 == 1);
  assert (-512 ** 1 == -512);
  assert (511 ** 1 == 511);
  assert (-512 ** 2 == 262144);
  assert (511 ** 2 == 261121);
  assert (-512 ** 3 == -134217728);
  assert (511 ** 3 == 133432831);
  assert (-512 ** 4 == 68719476736);
  assert (511 ** 4 == 68184176641);
  assert (-512 ** 5 == -35184372088832);
  assert (511 ** 5 == 34842114263551);
  assert (-512 ** 6 == 18014398509481984);
  assert (511 ** 6 == 17804320388674561);
  assert (-1024 ** 0 == 1);
  assert (1023 ** 0 == 1);
  assert (-1024 ** 1 == -1024);
  assert (1023 ** 1 == 1023);
  assert (-1024 ** 2 == 1048576);
  assert (1023 ** 2 == 1046529);
  assert (-1024 ** 3 == -1073741824);
  assert (1023 ** 3 == 1070599167);
  assert (-1024 ** 4 == 1099511627776);
  assert (1023 ** 4 == 1095222947841);
  assert (-1024 ** 5 == -1125899906842624);
  assert (1023 ** 5 == 1120413075641343);
  assert (-2048 ** 0 == 1);
  assert (2047 ** 0 == 1);
  assert (-2048 ** 1 == -2048);
  assert (2047 ** 1 == 2047);
  assert (-2048 ** 2 == 4194304);
  assert (2047 ** 2 == 4190209);
  assert (-2048 ** 3 == -8589934592);
  assert (2047 ** 3 == 8577357823);
  assert (-2048 ** 4 == 17592186044416);
  assert (2047 ** 4 == 17557851463681);
  assert (-2048 ** 5 == -36028797018963968);
  assert (2047 ** 5 == 35940921946155007);
  assert (-4096 ** 0 == 1);
  assert (4095 ** 0 == 1);
  assert (-4096 ** 1 == -4096);
  assert (4095 ** 1 == 4095);
  assert (-4096 ** 2 == 16777216);
  assert (4095 ** 2 == 16769025);
  assert (-4096 ** 3 == -68719476736);
  assert (4095 ** 3 == 68669157375);
  assert (-4096 ** 4 == 281474976710656);
  assert (4095 ** 4 == 281200199450625);
  assert (-4096 ** 5 == -1152921504606846976);
  assert (4095 ** 5 == 1151514816750309375);
  assert (-8192 ** 0 == 1);
  assert (8191 ** 0 == 1);
  assert (-8192 ** 1 == -8192);
  assert (8191 ** 1 == 8191);
  assert (-8192 ** 2 == 67108864);
  assert (8191 ** 2 == 67092481);
  assert (-8192 ** 3 == -549755813888);
  assert (8191 ** 3 == 549554511871);
  assert (-8192 ** 4 == 4503599627370496);
  assert (8191 ** 4 == 4501401006735361);
  assert (-16384 ** 0 == 1);
  assert (16383 ** 0 == 1);
  assert (-16384 ** 1 == -16384);
  assert (16383 ** 1 == 16383);
  assert (-16384 ** 2 == 268435456);
  assert (16383 ** 2 == 268402689);
  assert (-16384 ** 3 == -4398046511104);
  assert (16383 ** 3 == 4397241253887);
  assert (-16384 ** 4 == 72057594037927936);
  assert (16383 ** 4 == 72040003462430721);
  assert (-32768 ** 0 == 1);
  assert (32767 ** 0 == 1);
  assert (-32768 ** 1 == -32768);
  assert (32767 ** 1 == 32767);
  assert (-32768 ** 2 == 1073741824);
  assert (32767 ** 2 == 1073676289);
  assert (-32768 ** 3 == -35184372088832);
  assert (32767 ** 3 == 35181150961663);
  assert (-32768 ** 4 == 1152921504606846976);
  assert (32767 ** 4 == 1152780773560811521);
  assert (-65536 ** 0 == 1);
  assert (65535 ** 0 == 1);
  assert (-65536 ** 1 == -65536);
  assert (65535 ** 1 == 65535);
  assert (-65536 ** 2 == 4294967296);
  assert (65535 ** 2 == 4294836225);
  assert (-65536 ** 3 == -281474976710656);
  assert (65535 ** 3 == 281462092005375);
  assert (-131072 ** 0 == 1);
  assert (131071 ** 0 == 1);
  assert (-131072 ** 1 == -131072);
  assert (131071 ** 1 == 131071);
  assert (-131072 ** 2 == 17179869184);
  assert (131071 ** 2 == 17179607041);
  assert (-131072 ** 3 == -2251799813685248);
  assert (131071 ** 3 == 2251748274470911);
  assert (-262144 ** 0 == 1);
  assert (262143 ** 0 == 1);
  assert (-262144 ** 1 == -262144);
  assert (262143 ** 1 == 262143);
  assert (-262144 ** 2 == 68719476736);
  assert (262143 ** 2 == 68718952449);
  assert (-262144 ** 3 == -18014398509481984);
  assert (262143 ** 3 == 18014192351838207);
  assert (-524288 ** 0 == 1);
  assert (524287 ** 0 == 1);
  assert (-524288 ** 1 == -524288);
  assert (524287 ** 1 == 524287);
  assert (-524288 ** 2 == 274877906944);
  assert (524287 ** 2 == 274876858369);
  assert (-524288 ** 3 == -144115188075855872);
  assert (524287 ** 3 == 144114363443707903);
  assert (-1048576 ** 0 == 1);
  assert (1048575 ** 0 == 1);
  assert (-1048576 ** 1 == -1048576);
  assert (1048575 ** 1 == 1048575);
  assert (-1048576 ** 2 == 1099511627776);
  assert (1048575 ** 2 == 1099509530625);
  assert (-1048576 ** 3 == -1152921504606846976);
  assert (1048575 ** 3 == 1152918206075109375);
  assert (-2097152 ** 0 == 1);
  assert (2097151 ** 0 == 1);
  assert (-2097152 ** 1 == -2097152);
  assert (2097151 ** 1 == 2097151);
  assert (-2097152 ** 2 == 4398046511104);
  assert (2097151 ** 2 == 4398042316801);
  assert (-4194304 ** 0 == 1);
  assert (4194303 ** 0 == 1);
  assert (-4194304 ** 1 == -4194304);
  assert (4194303 ** 1 == 4194303);
  assert (-4194304 ** 2 == 17592186044416);
  assert (4194303 ** 2 == 17592177655809);
  assert (-8388608 ** 0 == 1);
  assert (8388607 ** 0 == 1);
  assert (-8388608 ** 1 == -8388608);
  assert (8388607 ** 1 == 8388607);
  assert (-8388608 ** 2 == 70368744177664);
  assert (8388607 ** 2 == 70368727400449);
  assert (-16777216 ** 0 == 1);
  assert (16777215 ** 0 == 1);
  assert (-16777216 ** 1 == -16777216);
  assert (16777215 ** 1 == 16777215);
  assert (-16777216 ** 2 == 281474976710656);
  assert (16777215 ** 2 == 281474943156225);
  assert (-33554432 ** 0 == 1);
  assert (33554431 ** 0 == 1);
  assert (-33554432 ** 1 == -33554432);
  assert (33554431 ** 1 == 33554431);
  assert (-33554432 ** 2 == 1125899906842624);
  assert (33554431 ** 2 == 1125899839733761);
  assert (-67108864 ** 0 == 1);
  assert (67108863 ** 0 == 1);
  assert (-67108864 ** 1 == -67108864);
  assert (67108863 ** 1 == 67108863);
  assert (-67108864 ** 2 == 4503599627370496);
  assert (67108863 ** 2 == 4503599493152769);
  assert (-134217728 ** 0 == 1);
  assert (134217727 ** 0 == 1);
  assert (-134217728 ** 1 == -134217728);
  assert (134217727 ** 1 == 134217727);
  assert (-134217728 ** 2 == 18014398509481984);
  assert (134217727 ** 2 == 18014398241046529);
  assert (-268435456 ** 0 == 1);
  assert (268435455 ** 0 == 1);
  assert (-268435456 ** 1 == -268435456);
  assert (268435455 ** 1 == 268435455);
  assert (-268435456 ** 2 == 72057594037927936);
  assert (268435455 ** 2 == 72057593501057025);
  assert (-536870912 ** 0 == 1);
  assert (536870911 ** 0 == 1);
  assert (-536870912 ** 1 == -536870912);
  assert (536870911 ** 1 == 536870911);
  assert (-536870912 ** 2 == 288230376151711744);
  assert (536870911 ** 2 == 288230375077969921);
  assert (-1073741824 ** 0 == 1);
  assert (1073741823 ** 0 == 1);
  assert (-1073741824 ** 1 == -1073741824);
  assert (1073741823 ** 1 == 1073741823);
  assert (-1073741824 ** 2 == 1152921504606846976);
  assert (1073741823 ** 2 == 1152921502459363329);
  