競プロ 数論変換 除数 一覧 ( FFT NTT MOD 一覧 )

仮公開

$p=a\times 2^b+1$ を満たす素数 $p$ と、 $\mathbb{Z}/p\mathbb{Z}$ の原始根の例 $g$ をリストアップします。便利そうな情報があればどんどん追記します。間違いが分かった場合はその部分を除いたのち、できれば修正しようと思います。

左から $p$ 、 $p$ の $16$ 進表記、 $g$ 、 $a\times 2^b+1$ です。

mod のリスト

$ p\lt 2^{30}$ , $ 23\leq b$

クリックで展開
$167772161$$\text{a000001}$$3$$5\times2^{25}+1$
$377487361$$\text{16800001}$$7$$45\times2^{23}+1$
$469762049$$\text{1c000001}$$3$$7\times2^{26}+1$
$595591169$$\text{23800001}$$3$$71\times2^{23}+1$
$645922817$$\text{26800001}$$3$$77\times2^{23}+1$
$754974721$$\text{2d000001}$$11$$45\times2^{24}+1$
$880803841$$\text{34800001}$$26$$105\times2^{23}+1$
$897581057$$\text{35800001}$$3$$107\times2^{23}+1$
$998244353$$\text{3b800001}$$3$$119\times2^{23}+1$
  • 合計長さ $2^{24}+1$ の列の畳み込み $\bmod$ を CRT で復元する場合の $\bmod$ の最大値
    $\text{floor}(\sqrt{167772161\times 469762049\times 754974721/ 2^{23}})=2663300486$

$ 2^{30}\leq p\lt 2^{31}$ , $ 23\leq b$

クリックで展開
$1107296257$$\text{42000001}$$10$$33\times2^{25}+1$
$1224736769$$\text{49000001}$$3$$73\times2^{24}+1$
$1300234241$$\text{4d800001}$$3$$155\times2^{23}+1$
$1484783617$$\text{58800001}$$5$$177\times2^{23}+1$
$1711276033$$\text{66000001}$$29$$51\times2^{25}+1$
$1811939329$$\text{6c000001}$$13$$27\times2^{26}+1$
$2013265921$$\text{78000001}$$31$$15\times2^{27}+1$
$2088763393$$\text{7c800001}$$5$$249\times2^{23}+1$
$2113929217$$\text{7e000001}$$5$$63\times2^{25}+1$
$2130706433$$\text{7f000001}$$3$$127\times2^{24}+1$
  • 合計長さ $2^{26}+1$ の列の畳み込み $\bmod$ を CRT で復元する場合の $\bmod$ の最大値
    $\text{floor}(\sqrt{469762049\times 1811939329\times 2013265921/ 2^{25}})=7146385095$

$ 2^{31}\leq p\lt 2^{32}$ , $ 24\leq b$

クリックで展開
$2281701377$$\text{88000001}$$3$$17\times2^{27}+1$
$2483027969$$\text{94000001}$$3$$37\times2^{26}+1$
$2533359617$$\text{97000001}$$3$$151\times2^{24}+1$
$2634022913$$\text{9d000001}$$3$$157\times2^{24}+1$
$2717908993$$\text{a2000001}$$5$$81\times2^{25}+1$
$2868903937$$\text{ab000001}$$35$$171\times2^{24}+1$
$2885681153$$\text{ac000001}$$3$$43\times2^{26}+1$
$3221225473$$\text{c0000001}$$5$$3\times2^{30}+1$
$3238002689$$\text{c1000001}$$3$$193\times2^{24}+1$
$3489660929$$\text{d0000001}$$3$$13\times2^{28}+1$
$3892314113$$\text{e8000001}$$3$$29\times2^{27}+1$
$3942645761$$\text{eb000001}$$3$$235\times2^{24}+1$
$4076863489$$\text{f3000001}$$7$$243\times2^{24}+1$
$4194304001$$\text{fa000001}$$3$$125\times2^{25}+1$

$ 2^{62}-2^{53}\leq p\lt 2^{62}$ , $ 45\leq b$

クリックで展開
$4603910272195756033$$\text{3fe4600000000001}$$5$$130851\times2^{45}+1$
$4603980640939933697$$\text{3fe4a00000000001}$$3$$130853\times2^{45}+1$
$4604226931544555521$$\text{3fe5800000000001}$$7$$32715\times2^{47}+1$
$4604543590893355009$$\text{3fe6a00000000001}$$14$$130869\times2^{45}+1$
$4605036172102598657$$\text{3fe8600000000001}$$3$$130883\times2^{45}+1$
$4605071356474687489$$\text{3fe8800000000001}$$14$$32721\times2^{47}+1$
$4605986150148997121$$\text{3febc00000000001}$$3$$65455\times2^{46}+1$
$4606302809497796609$$\text{3fece00000000001}$$3$$130919\times2^{45}+1$
$4609258296753258497$$\text{3ff7600000000001}$$3$$131003\times2^{45}+1$
$4609610140474146817$$\text{3ff8a00000000001}$$10$$131013\times2^{45}+1$
$4610208274799656961$$\text{3ffac00000000001}$$3$$65515\times2^{46}+1$
$4611615649683210241$$\text{3fffc00000000001}$$11$$65535\times2^{46}+1$

$ 2^{63}-2^{53}\leq p\lt 2^{63}$ , $ 45\leq b$

クリックで展開
$9214540759460478977$$\text{7fe0a00000000001}$$3$$261893\times2^{45}+1$
$9214646312576745473$$\text{7fe1000000000001}$$3$$32737\times2^{48}+1$
$9215701843739410433$$\text{7fe4c00000000001}$$3$$130963\times2^{46}+1$
$9216546268669542401$$\text{7fe7c00000000001}$$3$$130975\times2^{46}+1$
$9219396202808737793$$\text{7ff1e00000000001}$$3$$262031\times2^{45}+1$
$9220170258994692097$$\text{7ff4a00000000001}$$5$$262053\times2^{45}+1$
$9220451733971402753$$\text{7ff5a00000000001}$$3$$262061\times2^{45}+1$
$9223336852482686977$$\text{7fffe00000000001}$$5$$262143\times2^{45}+1$

おまけ

$p\lt 2^{32}$ , $a\times 3^b+1$ , $ 15\leq b$

クリックで展開
$57395629$$\text{36bc9ad}$$10$$4\times3^{15}+1$
$86093443$$\text{521ae83}$$2$$2\times3^{16}+1$
$258280327$$\text{f650b87}$$5$$2\times3^{17}+1$
$373071583$$\text{163c9edf}$$3$$26\times3^{15}+1$
$401769397$$\text{17f283b5}$$5$$28\times3^{15}+1$
$487862839$$\text{1d143237}$$3$$34\times3^{15}+1$
$573956281$$\text{2235e0b9}$$11$$40\times3^{15}+1$
$832236607$$\text{319aec3f}$$3$$58\times3^{15}+1$
$860934421$$\text{3350d115}$$2$$20\times3^{16}+1$
$1004423491$$\text{3bde4943}$$7$$70\times3^{15}+1$
$1492286329$$\text{58f27b79}$$11$$104\times3^{15}+1$
$1693171027$$\text{64ebbd53}$$2$$118\times3^{15}+1$
$2008846981$$\text{77bc9285}$$2$$140\times3^{15}+1$
$2094940423$$\text{7cde4107}$$3$$146\times3^{15}+1$
$2554105447$$\text{983c8e67}$$5$$178\times3^{15}+1$
$2812385773$$\text{a7a199ed}$$5$$196\times3^{15}+1$
$2869781401$$\text{ab0d6399}$$26$$200\times3^{15}+1$
$2955874843$$\text{b02f121b}$$5$$206\times3^{15}+1$
$3070666099$$\text{b706a573}$$3$$214\times3^{15}+1$
$3214155169$$\text{bf941da1}$$23$$224\times3^{15}+1$
$3357644239$$\text{c82195cf}$$6$$26\times3^{17}+1$
$3386342053$$\text{c9d77aa5}$$2$$236\times3^{15}+1$
$3415039867$$\text{cb8d5f7b}$$2$$238\times3^{15}+1$
$3587226751$$\text{d5d0bc7f}$$3$$250\times3^{15}+1$
$3788111449$$\text{e1c9fe59}$$7$$88\times3^{16}+1$
$3874204891$$\text{e6ebacdb}$$2$$10\times3^{18}+1$
$4161183031$$\text{f8069d37}$$6$$290\times3^{15}+1$
$4218578659$$\text{fb7266e3}$$2$$98\times3^{16}+1$

$ m|a$ $(3\leq m\leq 101)$ , $ 10^8\leq p\leq 10^9$

整数 $m$ を適当に選ぶ。 $10^8\leq p\leq 10^9$ であり、 $a$ を $m$ の倍数として $p=a\times 2^b+1$ となるような $p$ が存在する最大の $b$ およびそのときの最大の $p$ 、原始根 $g$ について $(m,b,p,g)$ の組。 yukicoder 1783 のようなことをやりたいとき。

クリックで展開
                           {  3, 24, 754974721, 11 }, {  5, 25, 167772161,  3 },
{  7, 26, 469762049,  3 }, {  9, 24, 754974721, 11 }, { 11, 23, 645922817,  3 },
{ 13, 22, 163577857, 23 }, { 15, 24, 754974721, 11 }, { 17, 23, 998244353,  3 },
{ 19, 21, 597688321, 11 }, { 21, 23, 880803841, 26 }, { 23, 20, 940572673,  7 },
{ 25, 22, 943718401,  7 }, { 27, 22, 113246209,  7 }, { 29, 19, 775421953,  5 },
{ 31, 21, 975175681, 17 }, { 33, 22, 415236097,  5 }, { 35, 23, 880803841, 26 },
{ 37, 22, 155189249,  6 }, { 39, 22, 163577857, 23 }, { 41, 21, 257949697,  5 },
{ 43, 21, 270532609, 22 }, { 45, 24, 754974721, 11 }, { 47, 22, 985661441,  3 },
{ 49, 21, 924844033,  5 }, { 51, 21, 962592769,  7 }, { 53, 22, 666894337,  5 },
{ 55, 22, 230686721,  6 }, { 57, 21, 597688321, 11 }, { 59, 20, 185597953,  5 },
{ 61, 21, 639631361,  6 }, { 63, 21, 924844033,  5 }, { 65, 21, 136314881,  3 },
{ 67, 20, 913309697,  3 }, { 69, 20, 940572673,  7 }, { 71, 23, 595591169,  3 },
{ 73, 22, 918552577,  5 }, { 75, 22, 943718401,  7 }, { 77, 23, 645922817,  3 },
{ 79, 20, 745537537,  5 }, { 81, 21, 169869313,  5 }, { 83, 20, 957349889,  6 },
{ 85, 20, 802160641, 11 }, { 87, 19, 775421953,  5 }, { 89, 21, 186646529,  3 },
{ 91, 19, 524812289,  3 }, { 93, 21, 975175681, 17 }, { 95, 21, 597688321, 11 },
{ 97, 20, 305135617,  5 }, { 99, 22, 415236097,  5 }, {101, 21, 635437057, 11 }

列挙用プログラムモジュールの例

C++ (クリックで展開)
#include <vector>
// m の倍数 + 1 の形の素数 p のうち、 minP <= p <= maxP を満たすものを小さい順に、最大 num 個列挙する。
// 32 ビット符号なし整数の範囲を想定
std::vector<unsigned int> GetPrime_MultiplePlusOne(unsigned int m, unsigned int minP, unsigned int maxP, unsigned int num);


#include <algorithm>
#include <cassert>

bool IsPrime32(unsigned int x) noexcept {
    if(x <= 1) return false;
    if(x % 2 == 0) return x == 2;
    using u32 = unsigned int;
    using u64 = unsigned long long;
    u32 d = x-1;
    int s = 0;
    int q = 31;
    while(!(d&1)){ d >>= 1; s++; }
    while(!(d >> q)) q--;
    u32 r = x; for(int t=0; t<6; t++) r*=2-r*x;
    u64 n2 = -(u64)x % x;
    auto red = [=](u64 t) -> u32 {
        u32 s = ((u64)((u32)t*r)*x) >> 32;
        t >>= 32;
        return (t >= s) ? t-s : t+x-s;
    };
    u32 one = red(n2);
    for(u32 base : { 2, 7, 61 }){
        if(base%x==0) continue;
        u32 a = base = red(base%x*n2);
        for(int e=q-1; e>=0; e--){ a = red((u64)a*a); if((d>>e)&1) a = red((u64)a*base); }
        if(a == one) continue;
        for(int t=1; t<s&&a!=x-one; t++) a = red((u64)a*a);
        if(a != x-one) return false;
    }
    return true;
}

std::vector<unsigned int> GetPrime_MultiplePlusOne(unsigned int m, unsigned int minP, unsigned int maxP, unsigned int num){
    if(num == 0) return {};
    std::vector<unsigned int> buf;
    assert(m >= 1);
    if(m <= 2 && minP <= 2 && 2 <= maxP) buf.push_back(2);
    if(m % 2 == 1){ m *= 2; } // primes are odd except "2"
    if(minP < 3) minP = 3;
    if(minP > maxP) return buf;
    for(unsigned int p = (minP-1)/m*m+1; buf.size() < num; p += m){
        if(IsPrime32(p)){
            buf.push_back(p);
        }
        if(maxP - p < m) break;
    }
    return buf;
}

どうやって作ってるの

$2^{64}$ 未満の正整数に対して正しく動作することが保証されたミラーラビンの素数判定法が知られています。モンゴメリ乗算による高速化を含めると、 $1$ 秒間におよそ $10^4$ ~ $10^5$ 回実行できました。

Deterministic variants of the Miller-Rabin primality test. Miller-Rabin SPRP bases records
This website summarizes the best known SPRP bases for deterministic variant of Miller-Rabin primality test

また、合成数の場合、非常に高い確率で素因数分解を高速に発見するアルゴリズムとしてポラードのロー法が知られています。 $1$ 秒間におよそ $10^2$ ~ $10^3$ 回実行できました。

原始根の位数は $p-1$ なので、原始根を発見するときは $p-1$ の素因数分解をもとに $g_e=2,3,\ldots$ が原始根であるかどうかを順に検証します。メインの表に示されたように、原始根はすぐに見つかりました。

Library Checker
Library Checker
タイトルとURLをコピーしました