(A_i = (i*a)\%n)的最小循环节
显然循环节
(A_i)显然有一个循环节(n),由鸽巢原理,(A_{n+1})一定会和(A_1,...,A_n)中的某一个值相等,因为对(n)取模之后一共只有(n)种取值落在([0,n-1])
之间。
具体循环节
现在想要求(A_i)的具体循环节,一个简单的想法是,要求所有值都相关的信息。不难发现常数项(a)肯定有(a|A_i)。之后要么选择(i)要么选择(n)。因为(i)是线性增大的,没有什么规律,剩下选择(n)相关的信息,但是取模的关系也比较麻烦,不能直接得到相关的信息。不妨将所有的(A_i)视作是(A_0 = 0)通过某种方式得到的,对于(A_i = (A_{i-1} + a)\%n),可以把取模换成减掉若干倍的(n),即表示成是(A_i=A_{i-1}+a-kn)。依照这个方向,可以发现(A_i)都可以表示成是若干倍的(a)减去若干倍的(n)。又因为有(a|A_i),所以((a,n)|A_i)。这样就找到了所有(A_i)都满足的信息。
设(d=(a,n)),那么(A_i)随(i)增大的过程也就是在不断遍历(d)的若干倍的过程,假设现在看的(i)是从(1)开始的,那么显然这个序列应该长成(d,2d,3d......0,d,2d,3d......0)显然长度也就是(n)里面有多少个(d),因为(d|n)所以整个遍历的过程肯定是一个完整的环。所以具体循环节的长度就是(dfrac{n}{(a,n)})。
例题
求同余方程(axequiv b(modspace n))中(x)的解落在([1,n])的个数有多少个。
不难发现这个形式就是之前所讨论的(A_i=(i*a)\%n)。先不看右边,只看左边有个很特殊的信息就是随着(x)的增长实际上左边是在不断遍历((a,n))的倍数的,不妨设之为(d)。那么只要右边的(b)满足有(d|b),就说明左边的取值是可以遍历到(b)这个值的,反之就不可能有任何一个解,因为左边只会有(d)的倍数。
回到之前的情况来,现在已知(d|b),但是(b)的取值肯定是唯一的,那么每一段循环的段里一定只有一个(b)。所以(b)的个数恰好就是有多少段循环节,由:循环节的长度是(dfrac{n}{(a,n)}),整个段的长度是(n),所以一共就有(n / dfrac{n}{(a,n)})个(b),也就是((a,n))。由此答案就是(0)或((a,n))。
(A_i=a^i\%n)的最小循环节
简化版问题
从经验上来说,假如取模题遇到一个质数,问题很可能变得非常简单(因为费马小定理的存在)。所以不妨先看一下这个问题的弱化情况,也就是(n=p)的情况。这个时候表达式写出来可以发现和费马小定理非常相像。因为质数非常的特殊,只有当(a)是(p|a)的时候,才会有两者不互质,而在这种情况下,所有的值全部都是相等的,没有意义。所以这种情况直接特判出去就可以了。那么除此之外的所有的(a)都会满足((a,p)=1),互质就是一个很强的条件了,有互质的时候可以很方便的对同余方程做化简。回到最开始的循环问题,设(a_requiv a_{r+s}(modspace p)),因为((a,n)=1)所以易知((a^r,n)=1)。于是可以把原方程化简到(a^sequiv1(modspace p))根据费马小定理我们可以知道这个方程应该是有唯一解的,也就是通过(a^pequiv p(mod space p))可以得到(a^{p-1}equiv 1(modspace p)),由于(s)的取值范围的限制,所以解就是(p-1)。即当(n=p)时,循环节取(p-1)。
那么相信学过乘法逆元的读者不难发现这个问题的最后一步和乘法逆元的求解关联很大,这里顺带引入一下乘法逆元。
乘法逆元
乘法逆元想要解决的是关于求除法的取模时产生的一些问题。因为除法是不直接满足同余运算的,所以需要做一些转换。用数学描述一下现在的问题就是,想要求(dfrac{A}{B}\%n),那么是否存在一个整数(C)满足(dfrac{A}{B}equiv AC(mod space n)),事实上也就是求(BCequiv1(modspace n))。由前面讲的循环节是在遍历((B,n))的倍数可以知道当((B,n)|1)的时候,也就是((B,n)=1)的时候才会有解,因为只要不是(1)就不可能会同余(1),只会遍历他的倍数。所以这个方程有解的先决条件是((B,n)=1)。那么这个时候又会分出两个情况,当(n=p)的时候借用费马小定理可以拿到一个很好的性质,就是(B*B^{p-2}equiv 1(modspace n)),那么显然(C=B^{p-2})快速幂求解即可。另外的一种情况没有这么好的情况,就直接使用(exgcd)求合法解即可。
完整版问题
首先,有一点读者看到现在可能会注意到的一点就是前面两种循环都是完全循环的,也就是一整个环。而对于完整的问题,也就是非常一般的情况,这种性质会不会还成立呢?留给读者思考(方向是证明是否存在一个元素会被两种方式得到,因为闭环都是前后依次推得的)。
那么结论是不行的,这种一般问题下会是不完整的。也就是说现在整个序列先会有一段不重复的,走到某个点之后才会开始有重复的段。当然现在先不考虑这个事情,还是回到最开始的形式,用数学表达循环的条件也就是(a^i\%nequiv a^{i+k}\%n),由于((a,n))不一定是(1),而互质的情况非常显然,这里就只讨论不互质的情况:既然两个不互质,不妨想办法抠一个互质的条件来,设(n=t*a^i),且((t,a)=1)。注意这里的(t)不一定是一个整数,但是不影响。在两者不互质的前提下,这个(t)的存在性是显然的,同时由于((a,t)=1)就有欧拉定理可以用了,也就是(a^{phi(t)}equiv1(modspace t)),现在想办法把(t)再换回(n)的条件:因为(t|n)所以根据积性函数的性质有(phi(t)|phi(n))。那么如果说(n)中有(t)没有的质因子(p^c),显然这个质因子会和(t)互质,那么乘上它对欧拉函数的影响是不会破坏互质性质的,换句话说,质数(phi(t))是可以换成(phi(n))的,表达式是(a^{phi(n)}equiv1(modspace t))。由于((a,t)=1)所以可以给两边乘上任意幂的(a)。于是形式就复原回原来的问题了,也就是(a^{r+phi(n)}equiv a^r(modspace t))。有了这个式子之后就可以进行任意的拓展了,对于某个(A_i=a^i\%n)可以有(a^{i+r-requiv a^{i+phi(n)+r-r}})。这个式子可以任意的拓展出(k)倍的(phi(n))。所以可以通过归纳得到(a^iequiv a^{i+kphi(n)})。其中(kin Z)。当然,原问题需要找的是最小的循环节,也就是最小的正整数解,根据基本的取模操作就可以得到最终的结论,也就是(a^bequiv a^{b\%phi(n)+phi(n)})。但是这个结论是有前提条件的,之前构造的时候,有用到(i+r-r)而当这个形式里的幂指数(b)不够(phi(n))的时候是不能使用的,而真的不够的时候,可以直接快速幂,因为实际问题中(n)不会特别大,假设(n)特别大则取模是没有意义的,而小于的时候指数至少会在一个可以计算的范围内,以快速幂的(log)速度能做的范围还是很大的。
当然上述内容同样基本就是在推拓展欧拉定理中最麻烦的一种情况,所以这里顺带把拓展欧拉定理,或者说广义欧拉降幂带一下。
(egin{cases}a^bequiv a^{b\%phi(n)}quad (a,n)=1\a^bquad (a,n) eq 1,b<phi(n)\a^bequiv a^{b\%phi(n)+phi(n)}quad (a,n) eq 1,b geq phi(n) end{cases})
其中第一种情况,由于两者互质,那么有欧拉定理(a^{phi(n)}equiv 1)。就有(a^requiv a^{r*phi(n)}),每有(phi(n))个(a)就相当于乘(1)。因此取模化到范围内就有(b\%phi(n))。对于第二种情况直接计算,第三种的说明如上。
感觉拓展欧拉定理的证明有些问题,以后再来修吧