【数学】数论干货(疑似密码学基础)

文章目录

  • 前言
  • 一. 整除、算术基本定理、同余、同余类、剩余系的基本定义
    • 1.整除
    • 2.算数基本定理
    • 3.同余
    • 4.同余类(也叫剩余类)
    • 5.剩余系
  • 二. 费马小定理的内容及其证明
    • 1.费马小定理基本内容
    • 2.费马小定理的证明(interesting 版)
  • 三. 欧拉函数
    • 1.欧拉函数的定义
    • 2.欧拉函数的性质
    • 3.欧拉函数的求法
  • 四. 欧拉定理
    • 1.欧拉定理的内容
    • 2.欧拉定理的证明
  • 五. 扩展欧拉定理
    • 1.扩展欧拉定理的内容
    • 2.扩展欧拉定理的证明
  • 六. 快速幂的算法
    • 1.快速幂算法的概述
    • 2.快速幂的算法
  • 七. 裴蜀定理(贝祖定理)
  • 八. 扩展欧几里得算法
  • 九. 群论基础知识
    • 1.群的定义
    • 2.群的幂运算
    • 3.群论中的”阶"
    • 4.子群与陪集
    • 5.同态和同构
    • 6.循环群与生成元
  • 十. 阶与原根
  • 十一. 模数意义下的乘法群
  • 十二. 逆元及逆元的求解方法
  • ——代码区——

前言

免责声明:!!!此文确确实实是博主一字一词地敲出来的,但是此文是博主在 ”青春懵懂时期“ 所写的一篇 ”杂文“,因为这个也不属于我的主专业方向,所以出现任何错误,欢迎各位大佬在评论区指出,小的一定认真修改!(还请大佬们嘴下留情)

一. 整除、算术基本定理、同余、同余类、剩余系的基本定义

1.整除

若整数 b b b 除以非零整数 a a a,商为整数,且余数为零, b b b 为被除数, a a a 为除数,即 a ∣ b a\mid b ab(“ ∣ \mid ”是整除符号),读作“a整除b”或“b能被a整除”。

例如:4整除16写作”4 ∣ \mid 16“。(注意:“ ∣ \mid ” 之前的数为除数,之后的为被除数,别搞反了。)

2.算数基本定理

  • 内容:设整数 N > 1 N>1 N>1,那么必有 N = p 1 p 2 ⋯ p n N=p_1p_2\cdots p_n N=p1p2pn,其中 p 1 , p 2 , ⋯ , p n p_1,p_2,\cdots,p_n p1p2pn 是素数,且在不计次序的意义下,这个分解式是唯一的。

    也就是说,任何一个自然数都可以表示为有限个素数的乘积(当然,素数就等于它本身),并且这种分解是唯一的,除非你改变素数的排列顺序。例如: 520 = 2 3 × 5 × 13 520=2^3\times 5\times 13 520=23×5×13。在这里,520可以被分解为3个2、1个5和1个13的乘积,这样的分解是固定的,只是乘数的顺序可以交换。

  • 如果把分解式中的相同素数合并,即得到:
    N = p 1 a 1 p 2 a 2 ⋯ p s a s N={p_1}^{a_1}{p_2}^{a_2}\cdots {p_s}^{a_s} N=p1a1p2a2psas
    其中 a 1 + a 2 + ⋯ + a s = n a_1+a_2+\cdots+a_s=n a1+a2++as=n p 1 < p 2 < ⋯ < p s p_1<p_2<\cdots<p_s p1<p2<<ps(这里的 p 1 , p 2 , ⋯ , p s p_1,p_2,\cdots ,p_s p1p2ps 互不相同),称为 N N N标准素因子分解式

  • 证明:对于这个问题,有两个关键点需要证明,一是这个整数 N N N凭什么一定能被这样分解?二是为什么这个分解是唯一的?
    前者我把它称作
    存在性
    ,后者我把它称作唯一性

    首先证明存在性

    • 如果这个数是素数,那太好了,素数就是它本身,已经可以看作是素数的乘积了。
    • 如果这个数是合数,那么根据合数的定义,它一定可以分解成为两个更小的因数的乘积,那么如果这两个数都是素数,则满足题意;如果这两个数中存在合数,那么可以继续将其分解为两个更小的数。以此往复,最后得到的一定会都是素数,因为一旦有合数,它就会被分解,分解出的数不会是1,那么剩下的就只能是素数了。

    其次证明唯一性

    • 预备知识——欧几里得引理

      • 内容: p p p是素数,若 p ∣ a b p\mid ab pab,那么有 p ∣ a p\mid a pa p ∣ b p\mid b pb

      • 证明:(反证)
        显然,当 p = a p=a p=a p = b p=b p=b 时直接可得出该结论。
        p ≠ a p\ne a p=a p ≠ b p\ne b p=b,现在假设 p ∤ a p\nmid a pa p ∤ b p\nmid b pb
        由前面讲存在性的内容可知,这里的 a b ab ab 一定可以分解成若干个素数的乘积的形式(注意这里我并没有使用算数基本定理,我只是说可以这样分解,至于是不是唯一的并不重要)。由于 a b ab ab a a a b b b 的乘积,则 a b ab ab 的素因数分解是 a a a b b b 的素因数分解的组合(乘积)。而现在 p ∤ a p\nmid a pa p ∤ b p\nmid b pb,那么 a b ab ab 的素因数分解中也一定不会包含 p p p 这个因子。但是由于 p ∣ a b p\mid ab pab,这意味着 a b ab ab 一定可以分解出一组含 p p p 的素因数的乘积的形式(事实上只有一组),即 a b ab ab 肯定可以分解出 p p p 这个因子。于是推出矛盾。即若 p ∣ a b p\mid ab pab,那么有 p ∣ a p\mid a pa p ∣ b p\mid b pb 证毕。

    • 引入欧几里得引理证明唯一性:
      假设 N N N 存在两种不同素数分解:
      N 1 = p 1 × p 2 × ⋯ p m N_1=p_1\times p_2\times\cdots p_m N1=p1×p2×pm
      以及
      N 2 = q 1 × q 2 × ⋯ q n N_2=q_1\times q_2\times\cdots q_n N2=q1×q2×qn
      由于 N 1 N_1 N1 N 2 N_2 N2 是一样的,所以在 N 1 = p 1 , p 2 , ⋯ p m N_1=p_1,p_2,\cdots p_m N1=p1p2pm m m m 个素数中任意一个素数 p i p_i pi 都满足 p i ∣ N 2 p_i\mid N_2 piN2,即
      p i ∣ ( q 1 × q 2 × ⋯ q n ) p_i\mid (q_1\times q_2\times\cdots q_n) pi(q1×q2×qn)
      那么由上述的欧几里得引理可知,对于这个素数 p i p_i pi 来说,一定有
      p i ∣ ( q 1 × q 2 × ⋯ q j ) p_i\mid (q_1\times q_2\times\cdots q_j) pi(q1×q2×qj)
      或者
      p i ∣ ( q j + 1 × ⋯ × q n − 1 × q n ) p_i\mid(q_{j+1}\times\cdots\times q_{n-1}\times q_n) pi(qj+1××qn1×qn)
      而无论是 p p p 还是 q q q,它们都是素数,意味着 q q q 不能被任何除 1 1 1 和自身的其他数整除辣!那如果 p i p_i pi 能整除上面两个式子之一的话,真相只有一个: p i = q k p_i=q_k pi=qk,即对于一个 p p p,总能找到一个 q q q 与之对应相等。
      这也就证明了 N 1 N_1 N1 N 2 N_2 N2 所谓的两种分解方式实际上是相等的,因此不存在两种不同的分解方式。换言之,这样的分解是唯一的,证毕。

3.同余

  • 基本定义:设 m m m 是正整数,如果 a , b a,b ab 的差 a − b a-b ab m m m 整除即 a − b = q m a-b=qm ab=qm,就称 a , b a,b ab 关于模 m m m 同余,或简称同余。记为:
    a ≡ b ( m o d m ) a\equiv b\pmod m ab(modm)

  • 一些性质:(”*“表示比较重要的性质)

    • (反身性) a ≡ a ( m o d m ) a\equiv a\pmod m aa(modm).

    • (对称性)若 a ≡ b ( m o d m ) a\equiv b\pmod m ab(modm),则 b ≡ a ( m o d m ) . b\equiv a\pmod m. ba(modm).

    • (传递性)若 a ≡ b ( m o d m ) a\equiv b\pmod m ab(modm) b ≡ c ( m o d m ) b\equiv c\pmod m bc(modm),则 a ≡ c ( m o d m ) . a\equiv c\pmod m. ac(modm).

    • *若 a ≡ b ( m o d m ) a\equiv b\pmod m ab(modm) c ≡ d ( m o d m ) c\equiv d\pmod m cd(modm),则 a ± c ≡ b ± d ( m o d m ) a\pm c\equiv b\pm d\pmod m a±cb±d(modm).

    • *若 a ≡ b ( m o d m ) a\equiv b\pmod m ab(modm) c ≡ d ( m o d m ) c\equiv d\pmod m cd(modm),则 a c ≡ b d ( m o d m ) ac\equiv bd\pmod m acbd(modm).

    • *若 a ≡ b ( m o d m ) a\equiv b\pmod m ab(modm) n ∈ N n\in N nN,则 a n ≡ b n ( m o d m ) a^n\equiv b^n\pmod m anbn(modm).

    • * a ≡ b ( m o d m ) a\equiv b\pmod m ab(modm) ⇔ \Leftrightarrow a − b = k m a-b=km ab=km

4.同余类(也叫剩余类)

  • 基本定义:同余是一种运算,它反映了两个数之间的某种联系,比如说 16 16 16 9 9 9除以 7 7 7的余数都为 2 2 2,即 16 ≡ 9 ( m o d 7 ) 16\equiv9\pmod 7 169(mod7)
    在这种层面上,同余可以理解为一种等价关系。因此,我们可以把整数集 Z Z Z 根据模 m m m 进行分类:

    如果 a , b a,b ab 同余,则 a , b a,b ab 属于同一类,否则不属于同一类,这样我们就会得到 m m m 个类,即:
    M i = { i + k m   ∣   k ∈ Z } , i = 0 , 1 , 2 , ⋯   , m − 1 , M_i=\{i+km\ |\ k\in Z\},i=0,1,2,\cdots,m-1, Mi={i+km  kZ},i=0,1,2,,m1,
    它们称为模 m m m 的同余类(或剩余类)。

  • 也就是说,同余类(剩余类)是一个集合,而它的其中任意一个元素叫做剩余,或叫代表元。

5.剩余系

  • 基本定义:从不同剩余类中选取一个数,也就是代表元,这些代表元形成的一个集合,叫做剩余系。也就是说剩余系中的每个数都是不同剩余类的代表元。

  • 剩余系中存在两种情况:完全剩余系简化剩余系

    • **完全剩余系:**如果我们把每个不同的剩余系中的一个代表元都取出来作为这个剩余系中的元素,那这个剩余系就是完全剩余系。举个例子,对于模 5 5 5来说,它的完全剩余系就是: { 0 , 1 , 2 , 3 , 4 } \{0,1,2,3,4\} {0,1,2,3,4}
      当然,像 { 1 , 2 , 3 , 4 , 5 } \{1,2,3,4,5\} {1,2,3,4,5} { 0 , 6 , 2 , 3 , 4 } \{0,6,2,3,4\} {0,6,2,3,4} ⋯ \cdots 这样的其实和上面的本质上是等价的,但为了方便一般都写成是上面的那种。

    • 简化剩余系:对于模 m m m 来说,在它的完全剩余系中去掉几个数就是简化剩余系。而去掉的这几个数就是与 m m m 不互素的数
      举个例子,对于模 8 8 8来说,它的完全剩余系是: { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 } \{0,1,2,3,4,5,6,7\} {0,1,2,3,4,5,6,7},其中 0 , 2 , 4 , 6 0,2,4,6 0,2,4,6都和 8 8 8不互素(注意 0 0 0 8 8 8的最小公因数是8),因此从中去掉,剩下的 { 1 , 3 , 5 , 7 } \{1,3,5,7\} {1,3,5,7}就是对于模 8 8 8的简化剩余系

二. 费马小定理的内容及其证明

1.费马小定理基本内容

  • 内容:如果 p p p 是一个质数, a a a 不能被 p p p 整除,那么有:

a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv1\pmod p ap11(modp)

  • 除此之外还有一个变形形式:如果 p p p 是一个质数,对于任意整数 a a a,都有:

a p ≡ a ( m o d p ) a^p\equiv a\pmod p apa(modp)

​ 根据前面说到的同余的性质,实际上就是同余两边同时乘以 a a a 得到的。那为什么这个公式可以对任意整数 a a a 都成立呢?
​ 也就是说这个公式在 a a a 能被 p p p 整除的情况下依然成立,来看一下:
​ 当 p ∣ a p\mid a pa 时,即 a a a p p p 的倍数,即 a = p k a=pk a=pk。此时
a p − a = ( p k ) p − p k = p ( p p − 1 k − k ) a^p- a=(pk)^p-pk=p(p^{p-1}k-k) apa=(pk)ppk=p(pp1kk)
​ 这个式子含了 p p p,说明它可以被 p p p 整除。即 a p − a ≡ 0 ( m o d p ) a^p-a\equiv0\pmod p apa0(modp),而由同余的性质:
a p − a ≡ 0 ( m o d p )   ⇔   a p ≡ a ( m o d p ) a^p-a\equiv0\pmod p\ \Leftrightarrow \ a^p\equiv a\pmod p apa0(modp)  apa(modp)

2.费马小定理的证明(interesting 版)

  • 证明:定理的证明千篇一律,有趣的思维万里挑一。这里我想用一种有趣的方式进行证明,过程如下:

    假设现在有一串珠子形成了一个环,环上珠子的数量是 p p p p p p是素数),现在我有 a a a 种颜色,我要给这个环上的每一个珠子进行上色。根据小学知识,每个珠子的上色情况都有 a a a 种,因此总共有 a p a^p ap 种上色方式。

    假如我要用至少两种颜色进行上色,总共就有 ( a p − a ) (a^p-a) (apa) 种上色方式。我们现在要证明的是 a p − a ≡ 0 ( m o d p ) a^p-a\equiv0\pmod p apa0(modp),也就是证明 a p − a a^p-a apa 这个式子能够被 p p p 整除,即证明 a p − a = k p a^p-a=kp apa=kp

    又回到这个给环上色问题上,问题就可以转化为:如果我们可以把至少用两种颜色这一情况分成 k k k 组,每组都刚好有 p p p 种上色方式
    那我们就可以证明 a p − a a^p-a apa p p p k k k 倍了!

请添加图片描述

总共 a p a^p ap 种上色方式 { 一种颜色 : a 至少两种颜色: a p − a { p 种 p 种 ⋮ p 种 \begin{cases}一种颜色:a\\\\\\至少两种颜色:a^p-a\begin{cases}p种\\p种\\\vdots \\p种\end{cases}\end{cases} 一种颜色:a至少两种颜色:apa ppp
为了方便,我们把可以通过旋转得到一模一样的两种上色方式称为”同款“,如下:

请添加图片描述

现在我们把”同款“的上色方式放在一组里面,由上图不难发现,当我们关注红色的珠子时,当它绕着旋转一圈后,它把每个位置都经过了一边。也就是说,当我们把这个环进行旋转时,它所出现的不同上色方式恰好就是这个环上的珠子的个数,也就是 p p p。也就说明了”同款“里不同的上色方式就是 p p p 。即我们确实可以把 ( a p − a ) (a^p-a) (apa) 种上色方式分成若干个 p p p 种上色方式。

BUT!这好像有个bug啊…万一在旋转过程中出现了两个一模一样的上色咋办?请看VCR:
请添加图片描述

别急!这个时候, p p p 是素数的条件就很关键了。既然是素数,就说明它只能被1和它本身整除,所以说实际上是不可能出现像上面那样有几个完整周期排列的。只要不是由几个完整的周期依次排列成环的,就不会出现像上面那样转了不到一圈就完全重合的现象。

综上,我们就说明了在 ( a p − a ) (a^p-a) (apa) 种上色方式中,我们可以把它分成 k k k 组,每组都恰好有 p p p 种上色方式。即
a p − a = k p ⇕ a p − a ≡ 0 ( m o d p ) ⇕ a p ≡ a ( m o d p ) ⇕ a p − 1 ≡ 1 ( m o d p ) a^p-a=kp\\ \Updownarrow\\ a^p-a\equiv0\pmod p\\ \Updownarrow\\ a^p\equiv a\pmod p\\ \Updownarrow\\ a^{p-1}\equiv1\pmod p apa=kpapa0(modp)apa(modp)ap11(modp)
费马小定理,证毕!

三. 欧拉函数

1.欧拉函数的定义

  • 欧拉函数:对于一个正整数 m m m,小于 m m m 的正整数中与 n n n 互素的数(包括1)的个数为 s s s,并定义 φ ( m ) = s \varphi(m)=s φ(m)=s φ ( m ) \varphi(m) φ(m) 称为欧拉函数。

2.欧拉函数的性质

  • 性质 1:若 a a a b b b 互素,则
    φ ( a b ) = φ ( a ) φ ( b ) (1) φ(ab) = φ(a) φ(b)\tag 1 φ(ab)=φ(a)φ(b)(1)

  • 性质 2:若 m , n m,n m,n 满足 m ∣ n m\mid n mn,则
    φ ( m ) ∣ φ ( n ) (2) \varphi(m)\mid\varphi(n)\tag 2 φ(m)φ(n)(2)

  • 性质 3: 如果 p p p 是一个素数,则

φ ( p ) = p − 1 (3) φ(p) = p - 1\tag 3 φ(p)=p1(3)

  • 性质 4: 如果 p p p 是素数, k k k 是正整数,则

φ ( p k ) = p k − p k − 1 = p k − 1 ( p − 1 ) (4) φ(p^k) = p^k - p^{k-1} = p^{k-1}(p - 1)\tag4 φ(pk)=pkpk1=pk1(p1)(4)

证明:

φ ( n ) = φ ( p k ) φ(n)=φ(p^k) φ(n)=φ(pk),即 n = p k n=p^k n=pk

那么由于 p p p 是一个素数,所以只要一个数的素因数里不包含 p p p,那么这个数就能与 n n n 互素。反之只要含 p p p 这个素因数,那么就不和 n n n 互素。也就是说像 p , 2 p , ⋯ p k − 1 p p,2p,\cdots p^{k-1}p p,2p,pk1p 这些数都不与 n = p k n=p^k n=pk 互素。那么与 n n n 互素的就有 p k − p k − 1 p^k-p^{k-1} pkpk1 个了,即
φ ( n ) = φ ( p k ) = p k − p k − 1 = p k − 1 ( p − 1 ) φ(n)=φ(p^k)= p^k - p^{k-1} = p^{k-1}(p - 1) φ(n)=φ(pk)=pkpk1=pk1(p1)

  • 性质 5: 对于 n n n 的质因数分解 n = p 1 k 1 p 2 k 2 ⋯ p m k m n = p_1^{k_1} p_2^{k_2} \cdots p_m^{k_m} n=p1k1p2k2pmkm,则
    φ ( n ) = n ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) ⋯ ( 1 − 1 p m ) (5) φ(n) = n \left(1 - \frac{1}{p_1}\right) \left(1 - \frac{1}{p_2}\right) \cdots \left(1 - \frac{1}{p_m}\right)\tag5 φ(n)=n(1p11)(1p21)(1pm1)(5)

证明:利用性质 1 φ ( n ) φ(n) φ(n) 可以表示为各素因数的积,即
φ ( n ) = φ ( p 1 k 1 ) ⋅ φ ( p 2 k 2 ) ⋯ φ ( p m k m ) φ(n) = φ(p_1^{k_1}) \cdot φ(p_2^{k_2}) \cdots φ(p_m^{k_m}) φ(n)=φ(p1k1)φ(p2k2)φ(pmkm)
对此,我来说明几点:

由于 p 1 , p 2 , ⋯ p m p_1,p_2,\cdots p_m p1,p2,pm 都是不同的素数,因此无论它们乘了多少次方,又或者把它们乘方之后拿其中几个相乘,它们之间一定不会有相同的因数的。换句话说, p 1 k 1 , p 2 k 2 , ⋯ p m k m p_1^{k_1},p_2^{k_2},\cdots p_m^{k_m} p1k1,p2k2,pmkm 这些数两两之间都是互素的。因此满足性质 1 的条件——“若 a a a b b b 互素”。

那为什么性质 1 的(1)式里面只拆成了两项,而这里可以拆成这么多项?
其实仔细想想就知道,我假设就拆成两项,这两项都是由不同的素数相乘得到的,这两项肯定互素,因此还可以再拆,直到最后就只剩下单独的一个 φ ( p i k i ) \varphi(p_i^{k_i}) φ(piki)

于是,我们根据性质 4 进一步展开为:
φ ( n ) = p 1 k 1 ( 1 − 1 p 1 ) ⋅ p 2 k 2 ( 1 − 1 p 2 ) ⋯ p m k m ( 1 − 1 p m ) \varphi (n)=p_1^{k_1} \left(1 - \frac{1}{p_1}\right) \cdot p_2^{k_2} \left(1 - \frac{1}{p_2}\right) \cdots p_m^{k_m} \left(1 - \frac{1}{p_m}\right) φ(n)=p1k1(1p11)p2k2(1p21)pmkm(1pm1)

把括号外的所有 p i k i p_i^{k_i} piki 合并起来,会发现 p 1 k 1 p 2 k 2 ⋯ p m k m p_1^{k_1} p_2^{k_2} \cdots p_m^{k_m} p1k1p2k2pmkm 就是 n n n。于是
φ ( n ) = n ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) ⋯ ( 1 − 1 p m ) φ(n) = n \left(1 - \frac{1}{p_1}\right) \left(1 - \frac{1}{p_2}\right) \cdots \left(1 - \frac{1}{p_m}\right) φ(n)=n(1p11)(1p21)(1pm1)
证毕!

3.欧拉函数的求法

  • 根据定义进行求解

    例如,我们求解 φ ( 10 ) \varphi(10) φ(10),可以把所有小于10的正整数全部列出来: { 1 , 2 , ⋯ 9 , 10 } \{1,2,\cdots9,10\} {1,2,9,10},再去掉与10不互素的数,最后 φ ( 10 ) = 4 \varphi(10)=4 φ(10)=4
    当然这个方法确实挺万能的,前提是你有时间…

  • m m m 是一个素数,可以直接根据上面提到的(3)式进行求解
    例如, φ ( 7 ) = 7 − 1 = 6 \varphi(7)=7-1=6 φ(7)=71=6

  • m m m 不是一个素数,我们可以根据性质1将其拆分为两个欧拉函数的乘积的形式,再通过性质2,也就是(3)式进行求解
    例如, φ ( 66 ) = φ ( 6 ) φ ( 11 ) = φ ( 2 ) φ ( 3 ) φ ( 11 ) = ( 2 − 1 ) × ( 3 − 1 ) × ( 11 − 1 ) = 20 \varphi(66)=\varphi(6)\varphi(11)=\varphi(2)\varphi(3)\varphi(11)=(2-1)\times(3-1)\times(11-1)=20 φ(66)=φ(6)φ(11)=φ(2)φ(3)φ(11)=(21)×(31)×(111)=20

    (注意拆出的两个数一定要是互素的,否则不能这样拆)

  • m = p k m=p^k m=pk

  • *当然,欧拉函数的求法有一个通式,也就是我们上面提到的(5)式:
    φ ( n ) = n ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) ⋯ ( 1 − 1 p m ) φ(n) = n \left(1 - \frac{1}{p_1}\right) \left(1 - \frac{1}{p_2}\right) \cdots \left(1 - \frac{1}{p_m}\right) φ(n)=n(1p11)(1p21)(1pm1)

四. 欧拉定理

1.欧拉定理的内容

  • 欧拉定理:若 a , n a,n a,n 均为正整数,且 gcd ⁡ ( a , n ) = 1 \gcd(a,n)=1 gcd(a,n)=1,则

a φ ( n ) ≡ 1 ( m o d n ) a^{\varphi(n)}\equiv1\pmod n aφ(n)1(modn)

​ 不是,这个式子怎么这么眼熟…看看之前的费马小定理:
a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv1\pmod p ap11(modp)
​ 其中 p p p 是素数,又根据我们欧拉函数的性质 3可知,这个费马小定理实际上就是欧拉定理的一种特殊情况

2.欧拉定理的证明

:设小于 n n n 且与 n n n 互素的所有正整数构成一个集合 Z n = { x 1 , x 2 , ⋯ x φ ( n ) } \Z_n=\{x_1,x_2,\cdots x_{\varphi(n)}\} Zn={x1,x2,xφ(n)},共 φ ( n ) \varphi(n) φ(n) 个元素。

现在,我将把 Z n \Z_n Zn 中的每个元素进行一个运算得到另一个值 m m m
a x 1   m o d   n = m 1 a x 2   m o d   n = m 2 ⋮ a x φ ( n )   m o d   n = m φ ( n ) ax_1\bmod n=m_1\\ ax_2\bmod n=m_2\\ \vdots\\ ax_{\varphi(n)}\bmod n=m_{\varphi(n)} ax1modn=m1ax2modn=m2axφ(n)modn=mφ(n)

知道 m m m 是怎么来的之后,现在我把这所有的 m m m 组成一个新的集合 S = { m 1 , m 2 , ⋯ m φ ( x ) } S=\{m_1,m_2,\cdots m_{\varphi(x)}\} S={m1,m2,mφ(x)},共 φ ( n ) \varphi(n) φ(n) 个元素。

现在我说 Z n = S \Z_n=S Zn=S 你信吗?不妨来证明一下:

由最开始的条件可知, a a a n n n 互素,集合 Z n \Z_n Zn 中的任意一个元素 x i x_i xi 也与 n n n 互素。那么易知它们的乘积 a x i ax_i axi 同样也与 n n n 互素。这是因为 a a a x i x_i xi 都无法拆分出一个 n n n 的约数,那它们的乘积当然也就拆不出这么一个数,因此互素。又因为 m m m 的值是通过 a x i ax_i axi n n n 得到的,我们都知道模运算并不会改变数与模数之间的最大公约数,所以可以推出 m m m n n n 互素。

简而言之就是
( a , n ) = 1 , ( x i , n ) = 1   ⇒   ( a x i , n ) = 1   ⇒   ( m i , n ) = 1 (7) (a,n)=1,(x_i,n)=1\ \Rightarrow\ (ax_i,n)=1\ \Rightarrow \ (m_i,n)=1\tag7 (a,n)=1,(xi,n)=1  (axi,n)=1  (mi,n)=1(7)
又由于 Z n \Z_n Zn 中的元素介于 n n n 之间,任意两个元素之间互不相等,于是无论它们模 n n n 还是乘以 a a a 之后模 n n n,都是不相等的:
x i ≠ x j    ⇒    ( x i   m o d   n ) ≠ ( x j   m o d   n )    ⇒    ( a x i   m o d   n ) ≠ ( a x j   m o d   n ) ⇓ m i ≠ m j (8) x_i\ne x_j\ \ \Rightarrow\ \ (x_i\bmod n)\ne (x_j\bmod n)\ \ \Rightarrow\ \ (ax_i\bmod n)\ne (a x_j\bmod n)\\ \Downarrow\\ m_i\ne m_j\tag8 xi=xj    (ximodn)=(xjmodn)    (aximodn)=(axjmodn)mi=mj(8)
因此,(7)和(8)就说明了一件事情:集合 S S S 中的元素与 n n n 互素且与互不相等。那我们都知道,这样的集合肯定是唯一确定的,那这不就是集合 Z n \Z_n Zn 吗?因此我们得出了 一个很重要的结论:
Z n = S \Z_n=S Zn=S
于是这两个集合内的每个元素相乘最后的结果肯定相等,即
∏ n = 1 φ ( n ) x i = ∏ n = 1 φ ( n ) m i \prod_{n=1}^{\varphi(n)}x_i=\prod_{n=1}^{\varphi(n)}m_i n=1φ(n)xi=n=1φ(n)mi
因此它们模 n n n 之后也相等,即
∏ n = 1 φ ( n ) x i   m o d   n = ∏ n = 1 φ ( n ) m i   m o d   n \prod_{n=1}^{\varphi(n)}x_i\bmod n=\prod_{n=1}^{\varphi(n)}m_i\bmod n n=1φ(n)ximodn=n=1φ(n)mimodn
我们对这个这个等式做进一步分析
∏ n = 1 φ ( n ) x i   m o d   n = ∏ n = 1 φ ( n ) m i   m o d   n = ( m 1 ⋅ m 2 ⋅ ⋯ m φ ( n ) )   m o d   n = [ ( a x 1   m o d   n ) ⋯ ( a x φ ( n )   m o d   n ) ]   m o d   n \begin{aligned}\prod_{n=1}^{\varphi(n)}x_i\bmod n&=\prod_{n=1}^{\varphi(n)}m_i\bmod n\\ &=(m_1\cdot m_2\cdot\cdots m_{\varphi(n)})\bmod n\\ &=[(ax_1\bmod n)\cdots(ax_{\varphi(n)}\bmod n)]\bmod n\end{aligned} n=1φ(n)ximodn=n=1φ(n)mimodn=(m1m2mφ(n))modn=[(ax1modn)(axφ(n)modn)]modn
由模运算的性质可知,该等式可以进一步转化为
= ( a x 1 ⋅ a x 2 ⋅ ⋯ a x φ ( n ) )   m o d   n =(ax_1\cdot ax_2\cdot\cdots ax_{\varphi(n)})\bmod n =(ax1ax2axφ(n))modn
将所有的 a a a 合并,即
= ( a φ ( n ) ⋅ x 1 ⋅ x 2 ⋯ x φ ( n ) )   m o d   n = ( a φ ( n ) ∏ n = 1 φ ( n ) x i )   m o d   n \begin{aligned}&=(a^{\varphi(n)}\cdot x_1\cdot x_2\cdots x_{\varphi(n)})\bmod n\\ &=(a^{\varphi(n)}\prod_{n=1}^{\varphi(n)}x_i)\bmod n\end{aligned} =(aφ(n)x1x2xφ(n))modn=(aφ(n)n=1φ(n)xi)modn
好家伙,这好长一串等式… 但是最后我们看看首尾都得到了什么
( a φ ( n ) ∏ n = 1 φ ( n ) x i )   m o d   n = ∏ n = 1 φ ( n ) x i   m o d   n (a^{\varphi(n)}\prod_{n=1}^{\varphi(n)}x_i)\bmod n=\prod_{n=1}^{\varphi(n)}x_i\bmod n (aφ(n)n=1φ(n)xi)modn=n=1φ(n)ximodn
根据瞪眼法,emm…其实是同余的性质啦,我们可以两边同时去除以 ∏ n = 1 φ ( n ) x i \prod_{n=1}^{\varphi(n)}x_i n=1φ(n)xi,最终得到
a φ ( n )   m o d   n = 1   m o d   n ⇓ a φ ( n ) ≡ 1 ( m o d n ) a^{\varphi(n)}\bmod n=1\bmod n\\ \Downarrow\\ a^{\varphi(n)}\equiv1\pmod n aφ(n)modn=1modnaφ(n)1(modn)
欧拉定理,证毕!

五. 扩展欧拉定理

1.扩展欧拉定理的内容

  • 顾名思义,这是欧拉定理的拓展,也就是一般形式。

  • 对于任意的正整数 a , b , n a,b,n a,b,n,若 b ≥ φ ( n ) b\geq\varphi(n) bφ(n) ,则有

    a b ≡ a b   m o d   φ ( n ) + φ ( n ) ( m o d n ) ( b ≥ φ ( n ) ) a^b\equiv a^{b\bmod \varphi (n)+\varphi(n)}\pmod n\\ (b\geq\varphi(n)) ababmodφ(n)+φ(n)(modn)(bφ(n))

2.扩展欧拉定理的证明

  • 引理 1
    a b ≡ a b   m o d   φ ( n ) ( m o d n ) a^b\equiv a^{b\bmod\varphi(n)}\pmod n ababmodφ(n)(modn)
    :我们都知道欧拉定理,即当 gcd ⁡ ( a , n ) = 1 \gcd(a,n)=1 gcd(a,n)=1,有
    a φ ( n ) ≡ 1 ( m o d n ) a^{\varphi(n)}\equiv1\pmod n aφ(n)1(modn)
    现在不妨设 b = k φ ( n ) + t , t = b   m o d   φ ( n ) b=k\varphi(n)+t,t=b\bmod\varphi(n) b=kφ(n)+tt=bmodφ(n),其中 k ∈ Z k\in \Z kZ

    那么就有
    a b   m o d   n = a k φ ( n ) + t   m o d   n = ( a φ ( n ) ) k ⋅ a t   m o d   n \begin{aligned}a^b\bmod n&=a^{k\varphi(n)+t}\bmod n\\ &=(a^{\varphi(n)})^k\cdot a^t\bmod n\end{aligned} abmodn=akφ(n)+tmodn=(aφ(n))katmodn
    根据欧拉定理以及模运算的性质,可得
    = 1 k ⋅ a t   m o d   n = a b   m o d   φ ( n )   m o d   n \begin{aligned}&=1^k\cdot a^t\bmod n\\ &=a^{b\bmod\varphi(n)}\bmod n\end{aligned} =1katmodn=abmodφ(n)modn
    综上,我们就得到了
    a b   m o d   n = a b   m o d   φ ( n )   m o d   n ⇓ a b ≡ a b   m o d   φ ( n ) ( m o d n ) a^b\bmod n=a^{b\bmod\varphi(n)}\bmod n\\ \Downarrow\\ a^b\equiv a^{b\bmod\varphi(n)}\pmod n abmodn=abmodφ(n)modnababmodφ(n)(modn)
    而这个式子,就是欧拉定理的推,这里把它叫做引理 1。

  • 引理 2

    p p p 是素数, q q q 是正整数且 q > 1 q>1 q>1,则
    φ ( p q ) ≥ q \varphi(p^q)\geq q φ(pq)q
    :由前面提到的欧拉函数的性质 4,也就是(5)式可知
    φ ( p q ) = p q − p q − 1 = p q − 1 ( p − 1 )   φ(p^q) = p^q - p^{q-1} = p^{q-1}(p - 1)\ φ(pq)=pqpq1=pq1(p1) 

    • p , q p,q p,q 都为2时,易知 φ ( 4 ) = 2 ≥ 2 \varphi(4)=2\geq2 φ(4)=22 没毛病。

    • p = 2 , q > 2 p=2,q>2 p=2,q>2 时, q q q 每增加1, φ ( p q ) φ(p^q) φ(pq) 都是成倍成倍地增加,所以肯定不等式右边比左边增加快得多,因此成立。

    • q = 2 , p > 2 q=2,p>2 q=2,p>2 时, p p p 在增加的时候, φ ( p q ) φ(p^q) φ(pq) 自然也在增加,而不等式右边的值不变,因此同样成立。

  • 扩展欧拉定理的证明

    • gcd ⁡ ( a , n ) = 1 \gcd(a,n)=1 gcd(a,n)=1 时,由同余的性质
      a φ ( n ) ≡ 1 ( m o d n )   ,   a b ≡ a b   m o d   φ ( n ) ( m o d n ) ⇓ a b ≡ a b   m o d   φ ( n ) + φ ( n ) ( m o d n ) a^{\varphi(n)}\equiv1\pmod n\ ,\ a^b\equiv a^{b\bmod\varphi(n)}\pmod n\\ \Downarrow\\ a^b\equiv a^{b\bmod \varphi (n)+\varphi(n)}\pmod n aφ(n)1(modn) , ababmodφ(n)(modn)ababmodφ(n)+φ(n)(modn)

    ​ 显然成立。

    • gcd ⁡ ( a , n ) ≠ 1 \gcd(a,n)\ne1 gcd(a,n)=1 时,我们对 n n n 进行标准素因子分解,可得
      n = p 1 q 1 p 2 q 2 ⋯ p s q s = ∏ i = 1 s p i q i n={p_1}^{q_1}{p_2}^{q_2}\cdots {p_s}^{q_s}=\prod_{i=1}^{s}p_i^{q_i} n=p1q1p2q2psqs=i=1spiqi

    这个时候我们只需要证明对于任意一个 p i q i p_i^{q_i} piqi,都有 a b ≡ a b   m o d   φ ( n ) + φ ( n ) ( m o d p i q i ) a^b\equiv a^{b\bmod \varphi (n)+\varphi(n)}\pmod{ p_i^{q_i}} ababmodφ(n)+φ(n)(modpiqi) 成立即可。何以见得?因为根据同余的一个很重要的性质,若

x ≡ y ( m o d n 1 ) , x ≡ y ( m o d n 2 ) ⇓ x ≡ y ( m o d Lcm ⁡ [ n 1 , n 2 ] ) x\equiv y\pmod {n_1},x\equiv y\pmod {n_2}\\ \Downarrow\\ x\equiv y\pmod {\operatorname {Lcm} [n_1,n_2]} xy(modn1),xy(modn2)xy(modLcm[n1,n2])

而由于我们这里的 p i q i p_i^{q_i} piqi 之间一定是互素的,因此当所有的 p i q i p_i^{q_i} piqi 都满足条件时,他们的最小公倍数也就是他们全部乘起来,即 n n n

由于 gcd ⁡ ( a , n ) ≠ 1 \gcd(a,n)\ne1 gcd(a,n)=1 ,说明 a a a 肯定是至少是某一个 p i q i p_i^{q_i} piqi 的倍数。这个时候我们再分类讨论一下:

(Ⅰ)当 gcd ⁡ ( a , p i q i ) = 1 \gcd(a,p_i^{q_i})=1 gcd(a,piqi)=1

由引理 1我们知道 a b ≡ a b   m o d   φ ( n ) ( m o d n ) a^b\equiv a^{b\bmod\varphi(n)}\pmod n ababmodφ(n)(modn),而这个 n n n p i q i p_i^{q_i} piqi 的倍数,不难发现,如果我把这里的模数 n n n 缩小一定的倍数,即缩小到 p i q i p_i^{q_i} piqi,这个引理 1的式子依旧是成立的,于是有:
a b ≡ a b   m o d   φ ( n ) ( m o d p i q i ) a^b\equiv a^{b\bmod\varphi(n)}\pmod {p_i^{q_i}} ababmodφ(n)(modpiqi)
同理有:
a φ ( n ) ≡ 1 ( m o d p i q i ) a^{\varphi(n)}\equiv1\pmod {p_i^{q_i}} aφ(n)1(modpiqi)
两边相乘即有:
a b ≡ a b   m o d   φ ( n ) + φ ( n ) ( m o d p i q i ) a^b\equiv a^{b\bmod \varphi (n)+\varphi(n)}\pmod{ p_i^{q_i}} ababmodφ(n)+φ(n)(modpiqi)
情况 (Ⅰ)证明完毕。

(Ⅱ) 当 gcd ⁡ ( a , p i q i ) ≠ 1 \gcd(a,p_i^{q_i})\ne1 gcd(a,piqi)=1

这种情况下, a a a 必然是 p i p_i pi 的倍数,假设 a = k p a=kp a=kp

这时就要用到我们的引理 2了,我们都知道前提条件 b ≥ φ ( n ) b\geq\varphi(n) bφ(n) 以及引理 2证明过的 φ ( p i q i ) ≥ q i \varphi(p_i^{q_i})\geq q_i φ(piqi)qi,因此有:
b ≥ φ ( n ) ≥ φ ( p i q i ) ≥ q i b\geq\varphi(n)\geq\varphi(p_i^{q_i})\geq q_i bφ(n)φ(piqi)qi
我们得到了 b ≥ q i b\geq q_i bqi,这可不得了了,那么我们就注意到此时 a b = ( k p ) b = k b p b a^b=(kp)^b=k^bp^b ab=(kp)b=kbpb 一定是 p i q i p_i^{q_i} piqi 的倍数

a b   m o d   φ ( n ) + φ ( n ) a^{b\bmod \varphi (n)+\varphi(n)} abmodφ(n)+φ(n) 也一定是 p i q i p_i^{q_i} piqi 的倍数!

因此既然这样,我们也就可以写出:
a b ≡ a b   m o d   φ ( n ) + φ ( n ) ≡ 0 ( m o d p i q i ) a^b\equiv a^{b\bmod \varphi (n)+\varphi(n)}\equiv 0\pmod{ p_i^{q_i}} ababmodφ(n)+φ(n)0(modpiqi)
证毕!

六. 快速幂的算法

1.快速幂算法的概述

  • 快速幂算法是一种用于计算幂运算的高效算法。它通过将指数进行二进制拆分,并利用指数的二进制表示形式来减少乘法和幂运算的次数,从而提高计算速度。

2.快速幂的算法

  • level 1

    当我们要计算 a 64 a^{64} a64 时,我们可以一个一个算的方式即: a × a × ⋯ a a\times a\times\cdots a a×a×a,这样算64次即可得出答案,但是这样显然太复杂了

  • level 2

    我们可以利用幂运算的性质,即:

a 1 × a 1 = a 2 a 2 × a 2 = a 4 ⋮ a 32 × a 32 = a 64 a^1\times a^1=a^2\\ a^2\times a^2=a^4\\ \vdots\\ a^{32}\times a^{32}=a^{64} a1×a1=a2a2×a2=a4a32×a32=a64

​ 这样的话,我们就只需要算6次就可以啦。

  • level 3

    但是, a 64 a^{64} a64 这个例子有点特殊了,我们发现它的指数,也就死 a n a^n an 中的 n n n,恰好是2的幂。那如果不是呢?比如 a 105 a^{105} a105
    注意到,虽然105不是2的幂,但是它可以拆解成几个2的幂的和的形式:
    105 = 1 + 8 + 32 + 64 105=1+8+32+64 105=1+8+32+64
    于是
    a 105 = a 1 + 8 + 32 + 64 = a 1 × a 8 × a 32 × a 64 \begin{aligned} a^{105}&=a^{1+8+32+64}\\ &=a^1\times a^8\times a^{32}\times a^{64}\end{aligned} a105=a1+8+32+64=a1×a8×a32×a64
    接下来再用上面 level 2 中讲到的方法计算就可以了。

    问题的关键就在于,如何把一个数分解称为2的 n n n 次幂之和呢?

  • level 4

    这时候就要用到我们的二进制了,我们高中的时候都学过一个数表示成二进制的转换方法。例如:二进制数1011,它的值在10进制中可以表示为 1 × 2 0 + 1 × 2 1 + 0 × 2 2 + 1 × 2 3 1\times2^0+1\times2^1+0\times2^2+1\times2^3 1×20+1×21+0×22+1×23,也就是11.

    通过这个转换方法,我们就可以把指数 n n n 转换称为 2 k 2^k 2k 的序列之和的形式,通过一次或多次这样的转换之后,这样我们就只需要计算 a , a 2 , a 4 ⋯ a ( 2 k ) a,a^2,a^4\cdots a^{(2^k)} a,a2,a4a(2k) 这样的数的值,然后再将它们相乘,即可完成整个幂运算。

七. 裴蜀定理(贝祖定理)

1.内容:设 d d d ( a , b ) (a,b) (a,b) 的最大公约数(通常记作 ( a , b ) (a,b) (a,b)),则有整数 u , v u,v u,v,使得 u a + v b = d ua+vb=d ua+vb=d

2.证明:
我们可以通过小学就学过的辗转相除法来证明这一结果。

  • a a a b b b 是两个整数,且假设 a > b a>b a>b(不满足无所谓,可以交换它们)。我们通过辗转相除法的原理,可以把 a a a 写成:

a = b q 1 + r 1 a = bq_1 + r_1 a=bq1+r1

其中, q 1 q_1 q1是商, r 1 r_1 r1 是余数。
如果 r 1 = 0 r_1=0 r1=0,那么 gcd ⁡ ( a , b ) = b \gcd(a,b)=b gcd(a,b)=b。此时裴蜀定理是显然成立的,取 u = 0 u=0 u=0 v = 1 v=1 v=1 即可。
如果 r 1 ≠ 0 r_1\ne0 r1=0,则继续进行辗转相除法:
b = r 1 q 2 + r 2 b = r_1 q_2 + r_2 b=r1q2+r2
重复这一过程,直到余数为 0。设最后一次余数为 r k r_k rk,那么:
⋮ r k − 3 = r k − 2 q k − 1 + r k − 1 r k − 2 = r k − 1 q k + r k \\ \vdots \\ r_{k-3} = r_{k-2} q_{k-1} + r_{k-1} \\ r_{k-2} = r_{k-1} q_k + r_k rk3=rk2qk1+rk1rk2=rk1qk+rk
当我们结束时,那么最后的  r k = 0 r_k=0 rk=0,此时根据辗转相除法的结果,$ r_{k-1}$ 就是 a a a b b b 的最大公因数,即 gcd ⁡ ( a , b ) = r k − 1 \gcd(a,b)=r_{k-1} gcd(a,b)=rk1

  • 一步步往回代

    通过上面的算法,我们得到了 gcd ⁡ ( a , b ) = r k − 1 \gcd(a,b)=r_{k-1} gcd(a,b)=rk1。接下来,我们从最后一步逐步回代,找到 x x x 和 y y y,使得:

r k − 1 = a x + b y r_{k-1} = a x + b y rk1=ax+by

现在我们从最后一步开始,由上面的式子我们可以得到:
r k = r k − 2 − r k − 1 q k r_{k} = r_{k-2} - r_{k-1} q_k rk=rk2rk1qk
将  r k − 1 r_{k-1} rk1 用前一步的表达式代入可得:
r k − 1 = r k − 3 − ( r k − 4 − r k − 3 q k − 2 ) q k − 1 = … r_{k-1} = r_{k-3} - (r_{k-4} - r_{k-3} q_{k-2}) q_{k-1} = \dots rk1=rk3(rk4rk3qk2)qk1=
每次都将上一步得到的余数表达式代入,最终我们会得到 r k − 1 = ( 一坨表达式 ) a + ( 另一坨表达式 ) b r_{k-1}=(一坨表达式)a+(另一坨表达式)b rk1=(一坨表达式)a+(另一坨表达式)b 的形式,而我们这两坨表达式里面的数都是若干个整数通过加法减法运算得到的,因此最后的结果也一定是整数。

因此,我们也就通过这样一步步回代的方式最终找到了对应的 u , v u,v u,v,使得
r k − 1 = gcd ⁡ ( a , b ) = u a + v b r_{k-1}=\gcd(a, b) =ua + vb rk1=gcd(a,b)=ua+vb
上面的字母太多了…看着烦,我们通过一个例子来感受一下这个过程。

  • 示例:

(累了,让我偷个懒吧。。。)

请添加图片描述

八. 扩展欧几里得算法

1.内容:

  • 对于一个不定方程

a x + b y = gcd ⁡ ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b)

来说,由裴祖定理我们知道这个方程一定是有解的,那么我们去求一组非零整数解 ( x , y ) (x,y) (x,y) 的过程,叫做扩展欧几里得算法

它的基本原理,也就是我们上面证明裴祖定理用到的回代的方法。具体是怎么实现的?后续会给出代码。

  • To be continue…

九. 群论基础知识

1.群的定义

  • G G G 是一个非空集合,“ ⋅ \cdot ”是上的 G G G 上的一个代数运算(注意这里的这个 “ ⋅ \cdot ” 运算是广义的,并不是小学学的普通的乘法,它可以是任意一种运算,只要它满足这样的几个条件,它就可以作为群定义中的一种运算),如果该运算满足以下条件:

    ①(封闭性)对任意的 a , b ∈ G a,b\in G a,bG 都有 a ⋅ b ∈ G a\cdot b\in G abG
    ②(结合律)对任意的 a , b , c ∈ G a,b,c\in G a,b,cG,都有 ( a ⋅ b ) ⋅ c = a ⋅ ( b ⋅ c ) (a\cdot b)\cdot c=a\cdot(b\cdot c) (ab)c=a(bc)
    ③(单位元)存在 e ∈ G e\in G eG,使得对任意的 a ∈ G a\in G aG,都有 e ⋅ a = a ⋅ e = a e\cdot a=a\cdot e=a ea=ae=a,此时 e e e 称为单位元
    ④(逆的存在性)对任意的 a ∈ G a\in G aG,存在 b ∈ G b\in G bG,使得 a ⋅ b = b ⋅ a = e a\cdot b=b\cdot a=e ab=ba=e,此时称 a a a b b b 互为逆元

满足以上条件,则称 G G G 关于“ ⋅ \cdot ”构成一个群,记作 ( G , ⋅ ) (G,\cdot) (G,)

例如:所有实数在普通加法运算下构成群 R + {R^+} R+

  • 有限群:如果群中的元素个数有限,则称群 G G G 为有限群
  • 阿贝尔群:如果一个群的这种运算满足了交换律,即: g 1 ⋅ g 2 = g 2 ⋅ g 1 g_1\cdot g_2=g_2\cdot g_1 g1g2=g2g1,则称这个群为阿贝尔群交换群

2.群的幂运算

对于群中的任意元素 a a a,定义 a a a n n n 次幂为:
a n = ( a ⋅ a ⋅ ⋯ a ) , n ∈ N a^n=(a\cdot a\cdot\cdots a),n\in N an=(aaa),nN
其中 a a a 在括号里出现 n n n 次。
注意:这里的 “ ⋅ \cdot ” 依然是定义在群中的运算,以下在群论基础这一大类中提到的 a n a^n an 均为群的幂运算。

3.群论中的”阶"

  • 当群的元素个数是有限多个时,群这个集合中的元素个数就是群的阶

  • 对于群中的一个元素 a a a,使得 a n = e a^n=e an=e e e e 为单位元)的最小正整数 n n n,叫做元素的阶

4.子群与陪集

  • 子群:设 G G G 是一个群, H H H 是其非空子集,若 H H H G G G 的运算也构成一个群,则称 H H H G G G 的子群。

  • 子群的判定

    判定定理 1:

    G G G 是一个群, H H H 是其非空子集,则 H H H G G G 的子群当且仅当——

    • ∀ a , b ∈ H \forall a,b\in H a,bH,都有 a ⋅ b ∈ H a\cdot b\in H abH(封闭)
    • ∀ a ∈ H \forall a\in H aH a − 1 ∈ H a^{-1}\in H a1H(逆元)

    :必要性是显然成立的,那么对于充分性,只需证明 e ∈ H e\in H eH

    因为 H H H 非空,则存在 a ∈ H a\in H aH,由条件可知, a − 1 ∈ H a^{-1}\in H a1H,因此根据已知的封闭性可得 a ⋅ a − 1 = e ∈ H a\cdot a^{-1}=e\in H aa1=eH

    判定定理 2:

    G G G 是一个群, H H H 是其非空子集,则 H H H G G G 的子群当且仅当—— a b − 1 ∈ H ab^{-1}\in H ab1H

    :To be added…

  • 陪集:设 H = { e , h 2 , … h m } H=\{e,h_2,\ldots h_m\} H={e,h2,hm} G G G 的一个子群,对与某个元素 g ∈ G g\in G gG,集合 g H = { g e , g h 2 , … g h m } gH=\{ge,gh_2,\ldots gh_m\} gH={ge,gh2,ghm}称为 H H H 的一个左陪集

    同理, H g = { e g , h 2 g , … h m g } Hg=\{eg,h_2g,\ldots h_mg\} Hg={eg,h2g,hmg} 称为 H H H 的一个右陪集

5.同态和同构

  • 单射,满射,双射

在高中阶段我们都学过映射,它反映了非空集合 X X X 的元素 x x x 到非空集合 Y Y Y 的元素 y y y 的关系。

单射:每一个 x x x 都有唯一的 y y y 与之对应;

满射:每一个 y y y 都必有至少一个 x x x 与之对应;

双射(又叫一一对应):每一个 x x x 都有 y y y 与之对应,每一个 y y y 都有 x x x 与之对应。

  • 同构

设有群 ( G , ∗ ) (G,*) (G,) 和群 ( H , ⋅ ) (H,\cdot) (H,),同构指 G G G H H H 存在函数: f : G → H f:G\rightarrow H f:GH,使得对于 G G G 中的所有 a a a b b b 以及 H H H 中的所有 A A A B B B,有 f ( a ∗ b ) = A ⋅ B f(a*b)=A\cdot B f(ab)=AB,其中 f ( a ) = A f(a)=A f(a)=A f ( b ) = B f(b)=B f(b)=B。记作 G ≅ H G\cong H GH

例如:整数加法群 ( Z , + ) (Z,+) (Z,+) 与偶数加法群 ( 2 Z , + ) (2Z,+) (2Z,+) 是同构的。映射 Z → 2 Z Z\rightarrow 2Z Z2Z 定义为 f ( x ) = 2 x f(x)=2x f(x)=2x

  • 同态

设有群 ( G , ∗ ) (G,*) (G,) 和群 ( H , ⋅ ) (H,\cdot) (H,),同态指 G G G H H H 存在函数: f : G → H f:G\rightarrow H f:GH,使得对于 G G G 中的所有 a a a b b b,有 f ( a ∗ b ) = A ⋅ B f(a*b)=A\cdot B f(ab)=AB,其中 f ( a ) = A f(a)=A f(a)=A f ( b ) = B f(b)=B f(b)=B

可见,同态并没有要求 f f f 是一个双射,是一个单射或满射,单射时称为单同态,满射时称为满同态

例如:群 G ( R , + ) G(R,+) G(R,+) 和群 H ( R + , × ) H(R^+,\times) H(R+,×) 是同构的。映射方法为 f ( x ) = e x f(x)=e^x f(x)=ex。因为 f ( x + y ) = e x e y = f ( x ) f ( y ) f(x+y)=e^xe^y=f(x)f(y) f(x+y)=exey=f(x)f(y),因此它们是同态的。

6.循环群与生成元

如果集合 { a , a 2 , a 3 , ⋯   , a k } \{a,a^2,a^3,\cdots,a^k\} {a,a2,a3,,ak} 包含了 G G G 的所有元素,称 a a a 生成群 ( G , ∗ ) (G,*) (G,),且群 ( G , ∗ ) (G,*) (G,) 的阶等于 a a a 的阶。
能够以这种方式生成的群叫做循环群 a a a 称为 ( G , ∗ ) (G,*) (G,)生成元

例如:模 6 6 6 意义下的加法群 ( G , + ( m o d    6 ) ) (G,+(\mod 6)) (G,+(mod6)) 是一个循环群,它包含 6 6 6 个元素: { 0 , 1 , 2 , 3 , 4 , 5 } \{0,1,2,3,4,5\} {0,1,2,3,4,5}
整数 1 1 1 可以作为它的一个生成元,因为由 1 1 1 便可以通过群的幂运算以及这个群中定义的运算来得到其他元素,比如 ( 1 + 1 )   m o d   6 = 2 (1+1)\bmod 6=2 (1+1)mod6=2

十. 阶与原根

m > 1 m>1 m>1 gcd ⁡ ( a , m ) = 1 \gcd(a,m)=1 gcd(a,m)=1,则使得
a t ≡ 1 ( m o d m ) a^t\equiv1\pmod m at1(modm)
成立的最小正整数 t t t 称为 a a a 对模 m m m 的阶,记为 δ m ( a ) \delta_m(a) δm(a) o r d m ⁡ a \operatorname{ord_m}a ordma

例如: m = 9 m=9 m=9 时,与 9 9 9 互质的数有 1 , 2 , 4 , 5 , 7 , 8 1,2,4,5,7,8 1,2,4,5,7,8,就拿 2 2 2 来讲,它在幂运算下模 9 9 9 的结果如下:(定义这里的幂运算为乘法)
2 1   m o d   9 = 2 2 2   m o d   9 = 4 2 3   m o d   9 = 8 2 4   m o d   9 = 7 2 5   m o d   9 = 5 2 6   m o d   9 = 1 2^1\bmod9=2\\ 2^2\bmod9=4\\ 2^3\bmod9=8\\ 2^4\bmod9=7\\ 2^5\bmod9=5\\ 2^6\bmod9=1 21mod9=222mod9=423mod9=824mod9=725mod9=526mod9=1
可以看到当运算到第 6 6 6 次的时候第一次出现了模 9 9 9 1 1 1 的情况,那么我们就说 2 2 2 对模 9 9 9 的阶是 6 6 6

  • 原根

m m m 是正整数, a a a 是整数,若 a a a 对模 m m m 的阶等于 φ ( m ) \varphi(m) φ(m),则称 a a a 为模 m m m 的一个原根。( φ ( m ) \varphi(m) φ(m) 表示欧拉函数)

就拿上面提到的例子来说,不难发现 φ ( 9 ) = 6 \varphi(9)=6 φ(9)=6,而 2 2 2 对模 9 9 9 的阶恰好是 6 6 6,那么这时 2 2 2 就是模 9 9 9 的原根。

  • 关于原根的一些性质

性质 1:模 n n n 有原根的冲要条件是 n = 2 , , 4 , p k , 2 p k n=2,,4,p^k,2p^k n=2,,4,pk,2pk,其中 p p p 为奇素数, k k k 为正整数。

性质 2:当正整数 n n n 有原根时,那么 m m m φ ( φ ( m ) ) \varphi(\varphi(m)) φ(φ(m)) 个原根。

性质 2(推广):当我们得知了最小原根为 a a a 的情况下,我们如何得知其他的原根呢?

我们只需要找出在 [ 1 , φ ( m ) ) [1,\varphi(m)) [1,φ(m)) 内与 φ ( m ) \varphi(m) φ(m) 互质的数,将其作为 a a a 的指数,再对其取模便可求出另外的原根。

例如:我们知道 m = 9 m=9 m=9 时的最小原根为 2 2 2 φ ( 9 ) = 6 \varphi(9)=6 φ(9)=6,而 φ ( 6 ) = 2 \varphi(6)=2 φ(6)=2,由性质 1 可知它有 2 2 2 个原根,在 [ 1 , 6 ) [1,6) [1,6) 之中与 6 6 6 互质的数有 1 1 1 5 5 5
2 1   m o d   9 = 2 2 5   m o d   9 = 5 2^1\bmod9=2\\ 2^5\bmod9=5 21mod9=225mod9=5
可知,模 9 9 9 的原根有两个,分别是 2 2 2 5 5 5

十一. 模数意义下的乘法群

  • 给定一个正整数 n n n,那么模 n n n 意义下的乘法群是在模运算和乘法运算定义下的群。具体来说,在这个群中的任意两个数相乘再对 n n n 取余后的数一定是这个群中的元素,这便是模 n n n 意义下的乘法群,通常记作 Z n ∗ \Z_n^* Zn

例如,就 n = 12 n=12 n=12 来讲,模 12 12 12 的乘法群 Z 12 ∗ \Z_{12}^* Z12 { 1 , 5 , 7 , 11 } \{1,5,7,11\} {1,5,7,11}
5 × 7   m o d   12 = 11 5 × 11   m o d   12 = 7 7 × 11   m o d   12 = 5 ⋮ 5\times7\bmod12=11\\ 5\times11\bmod12=7\\ 7\times11\bmod12=5\\ \vdots 5×7mod12=115×11mod12=77×11mod12=5
可见,在这个群中的任意两个元素相乘再模 12 12 12,都是这个群中的元素。

  • 群中的元素: n n n 的乘法群中的元素一定与 n n n 互素

    简单说明:这可以用裴蜀定理来说明,根据裴蜀定理 gcd ⁡ ( a , n ) = 1 \gcd(a,n)=1 gcd(a,n)=1 时,方程 a x + n y = 1 ax+ny=1 ax+ny=1 一定有解,而这个" 1 1 1"恰好是这个群的单位元,这保证了构成群的基本条件。

  • 单位元:易知在模数意义下的乘法群中的单位元就是 1 1 1。因为任何一个数乘以 1 1 1 再模 n n n 之后的结果一定是这个数本身。

  • 逆元:该群中的每个元素都有逆元。例如上面 n = 12 n=12 n=12 的例子,每个元素的逆元都恰好是它们自身。

十二. 逆元及逆元的求解方法

  • 逆元(inv)

①(模乘的)逆元:进一步讲一下逆元,逆元又叫数论倒数,和普通倒数不同,数论倒数一定是一个整数。
其定义为:对于正整数 a a a p p p,若有 a x ≡ 1 ( m o d p ) ax\equiv1\pmod p ax1(modp),那么把这个同余方程中的 x x x 的解叫做 a a a p p p 的逆元。

a a a 存在模乘逆元的充要条件是 a a a p p p 互质
简单说明:要想说明 a x ≡ 1 ( m o d p ) ax\equiv1\pmod p ax1(modp) 有这么一个 x x x ,可以进行一个简单的变形,因为是对 a x ax ax 取模,相当于是把 a x ax ax 减掉了 k k k p p p 最终余下了 1 1 1,相当于可以写成 a x − k p = 1 ax-kp=1 axkp=1。而根据裴蜀定理,方程 a x + p y = 1 ax+py=1 ax+py=1 有解的充要条件时 gcd ⁡ ( a , p ) = 1 \gcd(a,p)=1 gcd(a,p)=1,由于参数无所谓正负,所以这和前面的 a x − k p = 1 ax-kp=1 axkp=1 时等价的,因此便说明了只有当 a a a 和模数 p p p 互质时 a a a 才存在逆元。

  • 逆元的求解方法

费马小定理求解逆元 a a a 存在乘法逆元的充要条件是 a a a p p p 互质,当模数 p p p 是素数时,由费马小定理:
a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv1\pmod p ap11(modp)
提出一个 a a a 出来,可以得到
a ⋅ a p − 2 ≡ 1 ( m o d p ) a\cdot a^{p-2}\equiv1\pmod p aap21(modp)
而这个式子就恰好满足了我们希望的形式,因此可以看出, a a a 的逆元就是 a p − 2 a^{p-2} ap2

扩展欧几里得算法求解逆元:我们都知道扩欧算法可以算出方程 a x + p y = gcd ⁡ ( a , b ) ax+py=\gcd(a,b) ax+py=gcd(a,b) 的一组解( a 、 p a、p ap 为参数)。而我们又知道 a a a 存在模乘逆元的充要条件是 a a a p p p 互质,因此原方程等价于 a x + p y = 1 ax+py=1 ax+py=1。而刚刚我们说明 a a a 存在模乘逆元的充要条件的时候提到过了,这个方程也就等价于
a x − k p = 1 ⇓ a x ≡ 1 ( m o d p ) ax-kp=1 \\ \Downarrow\\ ax\equiv1\pmod p axkp=1ax1(modp)
于是我们便可以通过扩展欧几里得算法求得逆元。

——代码区——

1.分解质因数

写了一段比较基础的代码,基本思路就是我只要找到一个质因数就把它print下来:

#include <stdio.h>
void number(int n);

int main() {
    int n;
    printf("请输入一个整数:");
    scanf_s("%d", &n);
    number(n);
    return 0;
}

void number(int n) {
    int i;
    printf("%d = ", n);

    for (i = 2; i <= n; i++) {

        while (n % i == 0) {
            printf("%d", i);
            n /= i;

            if (n > 1) {
                printf(" * ");
            }
        }
    }
}

我就默认1不在这个讨论的范围内哈,如果非要考虑的话,加一个判断说n是否为1就行了。

2.计算一个数的欧拉函数

#include<stdio.h>
#include<math.h>
int eular(int n);

int main() {
    int n;
    printf("请输入一个正整数:");
    scanf_s("%d", &n);
    printf("该正整数的欧拉函数值为:%d", eular(n));
    return 0;
}

int eular(int n) {
    int result = n;
    for (int i = 2; i <= sqrt(n); i++) {
        if (n % i == 0) {
            result = result / i * (i - 1);
        }
        while (n % i == 0) {
            n /= i;
        }
    }
    if (n > 1) {
        result = result / n * (n - 1);
    }
    return result;
}


3.快速幂算法

#include <stdio.h>
long long fastpower(long long base, long long power);

int main() {
    int a, b;
    printf("请分别输入底数和指数:");
        scanf_s("%d %d", &a ,&b);
        long long result=fastpower(a,b);
        printf("%lld", result);
        return 0;
}

long long fastpower(long long base, long long power) {
    long long result = 1;
    while (power > 0) {
        if (power % 2 == 0) {
            power = power / 2;
            base = base * base % 1000;
        }
        else {
            power = power - 1;
            result = result * base % 1000;
            power = power / 2;
            base = base * base % 1000;
        }
    }
    return result;
}

4.扩展欧几里得算法

具体函数会在下面题中给到

5.求解同余方程 a x ≡ 1 ( m o d b ) ax\equiv 1\pmod b ax1(modb) 的最小正整数解

#include <stdio.h>
int extgcd(int a, int b, int* x, int* y);
int mod_inverse(int a, int b);

int main() {
    int a, b;
    printf("请输入a和b的值:");
    scanf_s("%d %d", &a, &b);
    int result = mod_inverse(a, b);
    if (result == -1) {
        printf("方程 %dx ≡ 1 (mod %d)无解。\n", a, b);
    }
    else {
        printf("最小正整数解是: %d\n", result);
    }
    return 0;
}

int extgcd(int a, int b, int* x, int* y) {
    if (b == 0) {
        *x = 1;
        *y = 0;
        return a;
    }
    int x1, y1;
    int gcd = extgcd(b, a % b, &x1, &y1);
    *x = y1;
    *y = x1 - (a / b) * y1;
    return gcd;
}

int mod_inverse(int a, int b) {
    int x, y;
    int gcd = extgcd(a, b, &x, &y);
    if (gcd != 1) {
        return -1;
    }
    else {
        return (x % b + b) % b;
    }
}

谢谢你能看到这里,你一定是个数学巨佬!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/973652.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[实现Rpc] 消息抽象层的具体实现

目录 具象层 _ 消息抽象的实现 信息的抽象类 实现 JsonMessage JsonRequest & JsonResponse 消息-不同消息分装实现 实现 Request RpcRequest TopicRequest ServiceRequest Response RpcResponse TopicResponse ServiceResponse 实现 生产工厂 本篇文章继 …

《A++ 敏捷开发》- 16 评审与结对编程

客户&#xff1a;我们的客户以银行为主&#xff0c;他们很注重质量&#xff0c;所以一直很注重评审。他们对需求评审、代码走查等也很赞同&#xff0c;也能找到缺陷&#xff0c;对提升质量有作用。但他们最困惑的是通过设计评审很难发现缺陷。 我&#xff1a;你听说过敏捷的结对…

PHP房屋出租出售高效预约系统小程序源码

&#x1f3e0; 房屋出租出售高效预约系统 —— 您的智能找房新选择 &#x1f4a1; 这是一款集智慧与匠心于一体的房屋出租出售预约系统&#xff0c;它巧妙地融合了ThinkPHP与Uniapp两大先进框架&#xff0c;精心打造而成。无论是小程序、H5网页&#xff0c;还是APP端&#xff…

给老系统做个安全检查——Burp SqlMap扫描注入漏洞

背景 在AI技术突飞猛进的今天&#xff0c;类似Cursor之类的工具已经能写出堪比大部分程序员水平的代码了。然而&#xff0c;在我们的代码世界里&#xff0c;仍然有不少"老骥伏枥"的系统在兢兢业业地发光发热。这些祖传系统的代码可能早已过时&#xff0c;架构可能岌…

Repeated Sequence

记suma[1]a[2]a[3]...a[n]。 该序列以a[1]&#xff0c;a[2]&#xff0c;a[3]....a[n]为循环节&#xff0c;明显的&#xff0c;问题可转化为:s%sum是否为该序列的某个连续子序列和。 断环为链。将a复制一份。 枚举a[i]为左端点的所有区间的和。再查找s是否存在。二分O&#x…

【DeepSeek】Mac m1电脑部署DeepSeek

一、电脑配置 个人电脑配置 二、安装ollama 简介&#xff1a;Ollama 是一个强大的开源框架&#xff0c;是一个为本地运行大型语言模型而设计的工具&#xff0c;它帮助用户快速在本地运行大模型&#xff0c;通过简单的安装指令&#xff0c;可以让用户执行一条命令就在本地运…

dockerfile 使用环境变量

ARG&#xff1a; Defining build-time variables ARG指令允许您定义在构建阶段可以访问但在构建映像之后不可用的变量。例如&#xff0c;我们将使用这个Dockerfile来构建一个映像&#xff0c;我们在构建过程中使用ARG指令指定的变量。 FROM ubuntu:latest ARG THEARG"fo…

基于WebGIS技术的校园地图导航系统架构与核心功能设计

本文专为IT技术人员、地理信息系统&#xff08;GIS&#xff09;开发者、智慧校园解决方案架构师及相关领域的专业人士撰写。本文提出了一套基于WebGIS技术的校园地图导航系统构建与优化方案&#xff0c;旨在为用户提供高效、智能、个性化的导航体验。如需获取校园地图导航系统技…

idea连接gitee(使用idea远程兼容gitee)

文章目录 先登录你的gitee拿到你的邮箱找到idea的设置选择密码方式登录填写你的邮箱和密码登录成功 先登录你的gitee拿到你的邮箱 具体位置在gitee–>设置–>邮箱管理 找到idea的设置 选择密码方式登录 填写你的邮箱和密码 登录成功

【从0做项目】Java音缘心动(3)———加密算法 MD5 BCrypt

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 零&#xff1a;项目结果展示 一&#xff1a;音乐播放器Web网页介绍 二&#xff1a;加密算法介绍 1&…

新数据结构(12)——代理

什么是代理 在进行操作时有时不希望用户直接接触到目标&#xff0c;这时需要使用代理让用户间接接触到目标 给目标对象提供一个代理对象&#xff0c;并且由代理对象控制着对目标对象的引用 图解&#xff1a; 代理的目的 控制访问&#xff1a;通过代理对象的方式间接的访问目…

基于大语言模型的推荐系统(1)

推荐系统&#xff08;recommendation system&#xff09;非常重要。事实上&#xff0c;搜索引擎&#xff0c;电子商务&#xff0c;视频&#xff0c;音乐平台&#xff0c;社交网络等等&#xff0c;几乎所有互联网应用的核心就是向用户推荐内容&#xff0c;商品&#xff0c;电影&…

学习threejs,使用MeshBasicMaterial基本网格材质

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.MeshBasicMaterial 二…

Selenium实战案例2:东方财富网股吧评论爬取

上一篇文章&#xff0c;我们使用Selenium完成了网页内文件的自动下载,本文我们将使用Selenium来爬取东方财富网股吧内笔记的评论数据。 网页内容分析 网页内容的分析是web自动化中的关键一步。通过分析网页结构&#xff0c;我们可以确定需要抓取的数据位置以及操作元素的方式。…

零基础学python--------第三节:Python的流程控制语法

Python&#xff0c;浮点数 11.345(单&#xff1a;4个字节&#xff0c; 双&#xff1a;8个字节) 。 十进制的数字25 ---> 11001 讲一个小数转化为二进制&#xff1a; 不断的乘以2 。取整数部分。 十进制的0.625 ----> 二进制&#xff1a; 0&#xff0c; 101 。 0.3 ---…

MKS SERVO42E57E 闭环步进电机_系列10 STM32_脉冲和串口例程

文章目录 第1部分 产品介绍第2部分 相关资料下载2.1 MKS E系列闭环步进驱动资料2.2 源代码下载2.3 上位机下载 第3部分 脉冲控制电机运行示例第4部分 读取参数示例4.1 读取电机实时位置4.2 读取电机实时转速4.3 读取电机输入脉冲数4.4 读取电机位置误差4.5 读取电机IO端口状态 …

小米路由器 AX3000T 降级后无法正常使用,解决办法

问题描述 买了个 AX3000T 路由器&#xff0c;想安装 OpenWRT 或者 安装 Clash 使用&#xff0c;看教程说是需要降级到 v1.0.47 版本。 结果刷机之后路由器无法打开了&#xff0c;一直黄灯亮&#xff0c;中间灭一下&#xff0c;又是黄灯长亮&#xff0c;没有 WIFI 没有连接。以…

强化学习-GAE方法

2016-ICLR-HIGH-DIMENSIONAL CONTINUOUS CONTROL USING GENERALIZED ADVANTAGE ESTIMATION 解决问题 强化学习的目标为最大化策略的预期总回报&#xff0c;其中一个主要困难为 行为对reward的影响存在一个长时间的延迟&#xff08;credit assignment problem&#xff09;。价…

写大论文的word版本格式整理,实现自动生成目录、参考文献序号、公式序号、图表序号

前情提要&#xff1a;最近开始写大论文&#xff0c;发现由于内容很多导致用老方法一个一个改的话超级麻烦&#xff0c;需要批量自动化处理&#xff0c;尤其是序号&#xff0c;在不断有增添删减的情况时序号手动调整很慢也容易出错&#xff0c;所以搞一个格式总结&#xff0c;记…

清华大学deepseek教程第四版 DeepSeek+DeepResearch 让科研像聊天一样简单(附下载)

deepseek使用教程系列 DeepSeekDeepResearch 让科研像聊天一样简单(附下载) https://pan.baidu.com/s/1VMgRmCSEzNvhLZQc8mu6iQ?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/f3d4511b790a