前言·

上次在 模n的Fibonacci的快速计算 里算出了二维的Fibonacci矩阵除了p=5p=5的情况,阶是p21p^2-1;三维的"3-Fibonacci"矩阵在p=ep=e(这是题目给的参数,不是自然常数)下的阶是e21e^2-1,但pp是其他值是不一定是p21p^2-1

赛后尝试了一下,用随机矩阵统计了一下,发现了一个神奇的规律:

n 阶(自乘多少次变II
2 p(p1)(p+1)p(p-1)(p+1)
3 p(p1)(p+1)(p2+p+1)p(p-1)(p+1)(p^2+p+1)
4 p(p1)(p+1)(p2+p+1)(p2+1)p(p-1)(p+1)(p^2+p+1)(p^2+1)
5 p(p1)(p+1)(p2+p+1)(p2+1)(p4+p3+p2+p+1)p(p-1)(p+1)(p^2+p+1)(p^2+1)(p^4+p^3+p^2+p+1)
6 p(p1)(p+1)(p2+p+1)(p2+1)(p4+p3+p2+p+1)(p2p+1)p(p-1)(p+1)(p^2+p+1)(p^2+1)(p^4+p^3+p^2+p+1)(p^2-p+1)
... ......\ ...

可以看出ni+1n_{i+1}项其实就是在nin_i项上乘上一个多项式,这些多项式可以组成一个数列,如果把这个数列记为PP的话,就是:

PiP_i
P0P_0 pp ??
P1P_1 (p1)(p-1)
P2P_2 (p+1)(p+1)
P3P_3 (p2+p+1)(p^2+p+1)
P4P_4 (p2+1)(p^2+1)
P5P_5 (p4+p3+p2+p+1)(p^4+p^3+p^2+p+1)
P6P_6 (p2p+1)(p^2-p+1)
... ......\ ...

总结一下性质,以及这个数列是怎么生成的:

  • P0=pP_0=pP1=p1P_1=p-1 ;
  • 如果qq是素数的话,有Pq=i=0q1piP_q=\sum_{i=0}^{q-1}p^i ;
  • Pa2=pab1P1PaP_{a^2}=\frac{p^{a*b}-1}{P_1*P_a} ;
  • Pab=pab1P1PaPbP_{a*b}=\frac{p^{a*b}-1}{P_1*P_a*P_b} , aba \ne b

所以如果MM是一个nnn*n的非奇异矩阵(即行列式不为0)、pp是奇素数的话,就(可能)会有:

Mnni=0nPi=Inn (mod p)M_{n*n}^{\prod_{i=0}^{n}P_i} = I_{n*n} \ (mod\ p)

这个是当时的猜想1,附上一段验证的代码(其实猜的大部分是对的,但还是有些代码里没考虑到的小细节错了):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# Sage
var('x')
def getOrderX(n):
P = [x, x-1]
for i in range(2, n+1):
if is_prime(i):
P.append(sum([x^j for j in range(i)]))
else:
for j in range(2, i): # brute
if i%j==0:
if j^2==i:
P.append((x^i-1)/(P[1]*P[j]))
else:
P.append((x^i-1)/(P[1]*P[j]*P[i//j]))
break
return P

def getOrder(p, n):
return int(product(getOrderX(n)).expand()(x=p))

def randMp(p, n):
while True:
mt = matrix(IntegerModRing(p), [[randrange(p) for _ in range(n)] for _ in range(n)])
if mt.det()!=0:
return mt

if __name__ == '__main__':
fail = 0
for i in range(10):
n = randint(2, 100)
while True:
p = random_prime(100000)
if p > 1: break
I = identity_matrix(IntegerModRing(p), n)
order = getOrder(p, n)
yes = True
for _ in range(10):
m = randMp(p, n)
if pow(m, order)==I:
continue
else:
print('%s\t%s\tfail' % (p, n))
print(pow(m, order))
fail += 1
yes = False
break
if yes:
print('%s\t%s\tyes' % (p, n))
print('------')
print('done!')
print('fail: %s' % fail) # 0

捣鼓一下,其实还有另一个猜想:当时统计了一下,发现其实i=0nPi\prod_{i=0}^{n}P_i是一个很松的界,实际测试(枚举小nn和小pp下的全部非奇异矩阵)的话是没有试过能到达这个阶的,而实际能达到的最大阶是:

dnϕd(p)=pn1\prod_{d|n}\phi_d(p) = p^n-1

记这个作猜想2吧(名字好像不重要:)

正文·

上面说的其实是一个星期前的内容了,根据这几天搜集到的资料,发现其实有更多可以完善的地方,比如:

  1. 上面说的“模p非奇异矩阵的群”其实就是在Fp\mathbb{F}_p上的一般线性群(general linear group over Fp\mathbb{F}_p),通常记作GL(n,Fp)GL(n, \mathbb{F}_p),其中nn是方阵的维度,Fp\mathbb{F}_p是指矩阵元素在域Fp\mathbb{F}_p上(当然也可以在其他域上,不过就是另外的内容了);
  2. 上面说的数列PP除了第0项其实是叫分圆多项式(cyclotomic polynomial),通常把它的第ii项写作ϕi(p)\phi_i(p),但那四点性质还是适用的;

网上拿“GL(n,p)”作关键字搜了一堆后,最终在这里找到“简单”的证明,还有一篇论文[1],然后有以下结论:

  1. 猜想2是对的,而且论坛的回复里一句话就证了:

    大概意思是,计算AA的特征值时,AλI|A-\lambda I|计算出来的多项式最多有nn项,除去全零项的话即最多pn1p^n-1种(然后后面怎么扯上GL(n,Fp)GL(n, \mathbb{F}_p)的还没搞懂,)

  2. 根据[1]的Theorem1,

    Fp\mathbb{F}_p上,其实就是m=1m=1,即有:

    qn=LCM(p1,p21,...,pn1)q_n=LCM(p-1, p^2-1, ..., p^n-1)

    实际上可以把分圆多项式代进去化简,即:

    qn=LCM(d1ϕd(p),d2ϕd(p),...,dnϕd(p))=i=1nϕi(p)q_n = LCM(\prod_{d|1}\phi_d(p), \prod_{d|2}\phi_d(p), ...,\prod_{d|n}\phi_d(p) ) = \prod_{i=1}^{n}\phi_i(p)

    在猜想1中,这一半是没问题的,有一个小细节问题是prp^r,论文的要求是prn>pr1p^r \ge n > p^{r-1},而我的nn是在randint(2, 100)中选的,pp是在random_prime(100000)中选的,即大概率是p1n>p0p^1 \ge n > p^0,也即rr大概率会是11

    另外扩展一下,符合GL(n,Fp)GL(n, \mathbb{F}_p)的元素个数,即元素在Fp\mathbb{F}_p上的nn维非奇异矩阵的个数是:

    i=0n1(pnpi)=i=0n1pi(pni1)\prod_{i=0}^{n-1}(p^n-p^i) = \prod_{i=0}^{n-1}p^i(p^{n-i}-1)

    即其实上面的prqnp^rq_n包含了这个式子的所有因子

总结以上,最后的结论是

ϕi\phi_i 为分圆多项式的第ii项、GL(n,Fp)GL(n, \mathbb{F}_p)是域 Fp\mathbb{F}_p上的一般线性群、AGLn(Fp)A \in GL_n(\mathbb{F}_p)IIGL(n,Fp)GL(n, \mathbb{F}_p)单位元,则有:

Apri=1nϕi(p)I  (in GLn(Zp))A^{p^r\prod_{i=1}^{n}\phi_i(p)} \equiv I \ \ (in\ GL_n(\mathbb{Z}_p))

其中prn>pr1p^r \ge n > p^{r-1};实际上,GL(n,Fp)GL(n, \mathbb{F}_p)中元素的最大阶只能到:

dnϕd(p)=pn1\prod_{d|n}\phi_d(p) = p^n-1

总结·

在翻资料的时候“好像”瞄到了有求GL(n,Fp)GL(n, \mathbb{F}_p)特征值然后分解的,看看能不能再水一篇(逃

当初线性代数没学好啊… …

当初抽象代数也没学好啊… …

参考·

[1] Ivan Niven, Fermat theorem for matrices, Duke Math. J. 15 (1948), 823-826