• 取模意义下的对数&生成元的查找


    取模意义下的对数&生成元(原根)的查找

    取模意义下的对数

    取模意义下的对数一般用在转化ntt式内的乘法成加法
    贯穿这一块的一句话同时也是最难理解的一句话:素数p的乘法群同构与p-1的加法群
    例如:
    (Z*_{13}) 1 2 4 8 3 6 12 11 9 5 10 7 (素数13的乘法群)
    (Z+_{12}) 0 1 2 3 4 5 6 7 8 9 10 11 (素数13-1的加法群)
    可以发现(Z*_{13})中两个数做乘法的结果对应(Z+_{12})中两个数做加法的结果
    乘法同构与加法容易想到对数运算
    可以发现我们要得到一个素数的乘法群需要知道它的原根,原根不知道的同学可以补习一下,内容不多。
    如果知道了原根应该就能理解取模意义下的对数怎么弄了
    例子中是用2作为生成元也就是13的原根,生成了这个数列,既然和(Z+_{12})同构,就可以表示对数了
    举个例子,13的乘法群中3是由2的4次方模上13得到的,同构出来则是
    在模13意义下:(log_{2}3 = 4 mod 12)
    这样子我们就可以对取模意义下的对数进行运算了
    但是,底数不是生成元,也就是不是原根的时候是没法进行对数运算的,因为没法构造出1到p-1所有的数
    同理,所以换底公式需要分母的对数和底数都是生成元。

    生成元(原根)的查找

    一般题目里面给的模数如果需要你求原根的话原根都会非常小,我们直接暴力求即可
    代码:

    #include<bits/stdc++.h>
    #define ll long long
    #define R register
    using namespace std;
    template<class T>
    void rea(T &x)
    {
    	char ch=getchar();int f(0);x = 0;
    	while(!isdigit(ch)) {f|=ch=='-';ch=getchar();}
    	while(isdigit(ch)) {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    	x = f?-x:x;
    }
    int ksm(int x, int k, int mod)
    {
    	int ret = 1;
    	while(k)
    	{
    		if(k&1) ret = 1ll*ret*x%mod;
    		x = 1ll*x*x%mod;
    		k >>= 1;
    	}
    	return ret;
    }
    int getG(int mod)
    {
    	int prime[10000], tot = 0;
    	int num = mod-1;
    	for(R int i = 2; i*i <= num; ++i)
    		if(num%i == 0)
    		{
    			prime[++tot] = i;
    			while(num%i == 0) num /= i;
    		}
    	if(num > 1) prime[++tot] = num;
    	num = mod-1;
    	for(R int i = 2; i <= num; ++i)
    	{
    		bool ban = 0;
    		for(R int j = 1; j <= tot; ++j) 
    			if(ksm(i, num/prime[j], mod) == 1) { ban = 1; break; }
    		if(!ban) return i;
    	}
    	return false;
    }
    int main()
    {
    	int mod = 1004535809;
    	printf("%d
    ", getG(mod));
    	return 0;
    }
    
    
  • 相关阅读:
    WebSocket
    betterscroll
    css font
    luckycanvas
    ios系统使用占比
    设备趋势
    高效阅读代码工具
    逻辑地址、物理地址、线性地址、虚拟地址
    怎么用抓包工具Fiddler进行弱网测试【杭州多测师_王sir】【杭州多测师】
    后端测试,服务器端测试【杭州多测师】【杭州多测师_王sir】
  • 原文地址:https://www.cnblogs.com/heanda/p/12378660.html
Copyright © 2020-2023  润新知