费马小定理和欧拉定理作业

CINTA 作业三



  1. p = 23 p=23 p=23 a = 3 a=3 a=3,使用费马小定理计算 a 2019 m o d    p a^{2019}\mod p a2019modp

    由题意可知:
    a 2019 m o d    p    ⟺    3 22 ∗ 91 + 17 ≡ 3 17 ( m o d    23 ) a^{2019}\mod p\iff 3^{22*91+17}\equiv 3^{17}(\mod 23) a2019modp32291+17317(mod23)

    又有: 3 17 ≡ 3 − 5 ( m o d    23 ) 3^{17}\equiv 3^{-5}(\mod 23) 31735(mod23)

    c = 3 c=3 c=3 则有: c c − 1 ≡ 1 ( m o d 23 ) cc^{-1}\equiv 1(mod 23) cc11(mod23)

    由扩展欧几里得定理得: c − 1 = 8 c^{-1}=8 c1=8

    又因为 g c d ( 8 , 23 ) = 1 gcd(8,23)=1 gcd(8,23)=1 ,可以得到:
    原式为: 8 5 m o d    23 = 16 8^5\mod 23=16 85mod23=16

  2. 使用费马小定理求解同余方程 x 50 ≡ 2 ( m o d    17 ) x^{50}\equiv 2(\mod 17) x502(mod17)

    由题意得:
    x 50 m o d    17    ⟺    x 3 ∗ 16 + 2 ≡ x 2 ( m o d    17 ) x^{50}\mod 17\iff x^{3*16+2}\equiv x^2(\mod 17) x50mod17x316+2x2(mod17)

    所以原式为: x 2 ≡ 2 ( m o d    17 ) x^2\equiv 2(\mod 17) x22(mod17)

    那么: x 2 − 2 = k ∗ 17 ( k ∈ Z ) x^2-2=k*17(k\in Z) x22=k17(kZ)

    所以当k为2时: x = ± 6 x=\pm 6 x=±6

  3. 请证明 13 整除 2 70 + 3 70 2^{70}+3^{70} 270+370

    要证: 13 ∣ ( 2 70 + 3 70 ) 13 | (2^{70}+3^{70}) 13∣(270+370)

    只需证: 2 70 + 3 70 ≡ 0 ( m o d    13 ) 2^{70}+3^{70}\equiv 0(\mod 13) 270+3700(mod13)

    因为 g c d ( 2 , 13 ) = g c d ( 3 , 13 ) = 1 gcd(2,13)=gcd(3,13)=1 gcd(2,13)=gcd(3,13)=1

    所以原式可以等价为: ( 2 70 m o d    13 ) + ( 3 70 m o d    13 ) (2^{70}\mod 13)+(3^{70}\mod 13) (270mod13)+(370mod13)

    再由费马小定理得原式为: ( 2 − 2 m o d    13 ) + ( 3 − 2 m o d    13 ) (2^{-2}\mod 13)+(3^{-2}\mod 13) (22mod13)+(32mod13)

    由拓展欧几里得定理得 2 和 3 的乘法逆元:分别为 -6 和 -4

    那么原式又变作: ( 36 m o d    13 ) + ( 16 m o d    13 ) (36\mod 13)+(16\mod 13) (36mod13)+(16mod13)

    由同模数加法得原式为: 52 m o d    13 = 0 52\mod 13=0 52mod13=0

    综上所述: 13 整除 2 70 + 3 70 2^{70}+3^{70} 270+370

  4. 使用欧拉定理计算 2 100000 m o d    55 2^{100000}\mod 55 2100000mod55

    由原式可知:
    p = 55 , p p=55, p p=55,p 不为素数

    p = 5 ∗ 11 p=5*11 p=511 二者均为素数

    那么, ϕ ( 5 ) = 5 − 1 = 4 \phi(5)=5-1=4 ϕ(5)=51=4 ,而 ϕ ( 11 ) = 11 − 1 = 10 \phi(11)=11-1=10 ϕ(11)=111=10

    再有 g c d ( 5 , 11 ) = 1 gcd(5,11)=1 gcd(5,11)=1

    由欧拉 P h i Phi Phi 公式:
    ϕ ( 55 ) = ϕ ( 5 ) ∗ ϕ ( 11 ) = 40 \phi(55)=\phi(5)*\phi(11)=40 ϕ(55)=ϕ(5)ϕ(11)=40

    因为 g c d ( 2 , 55 ) = 1 gcd(2,55)=1 gcd(2,55)=1 得: 2 100000 ≡ 2 100000 m o d    ϕ ( 55 ) ( m o d    55 ) 2^{100000}\equiv 2^{100000\mod\phi(55)}(\mod 55) 21000002100000modϕ(55)(mod55)

    所以原式为: 2 100000 ≡ 2 0 ( m o d    55 ) = 1 2^{100000}\equiv 2^0(\mod 55)=1 210000020(mod55)=1

  5. 手动计算 7 1000 7^{1000} 71000 的最后两个数位等于什么?

    由题意知:所求数为 7 1000 m o d    100 7^{1000}\mod 100 71000mod100

    据欧拉定理: ϕ ( 100 ) = ϕ ( 4 ) ∗ ϕ ( 25 ) = 40 \phi(100)=\phi(4)*\phi(25)=40 ϕ(100)=ϕ(4)ϕ(25)=40

    因为 g c d ( 7 , 100 ) = 1 gcd(7,100)=1 gcd(7,100)=1 得: 7 1000 ≡ 7 1000 m o d    ϕ ( 100 ) ( m o d    100 ) 7^{1000}\equiv 7^{1000\mod\phi(100)}(\mod 100) 7100071000modϕ(100)(mod100)

    所以结果为: 7 1000 m o d    = 1 7^{1000}\mod=1 71000mod=1 ,最后两个数位为: 01

  6. 编写 Python 语言程序完成欧拉 P h i Phi Phi 函数的计算,即输入正整数 n n n,计算并返回 ϕ ( n ) \phi(n) ϕ(n)

import math


# 朴素的欧拉函数

def classic_Euler(n):
    num = 1
    for i in range(2, n):
        if math.gcd(i, n) == 1:
            num += 1
    return num


# 优化欧拉函数

def obb_judge(n):
    li = []
    for num in range(2, n + 1):
        flag = 0
        for i in range(2, int(math.sqrt(num)) + 1):
            if num % i == 0:
                flag = 1
            # print('{} % {} == {}'.format(num, i, num % i))
        if flag == 0:
            li.append(num)
    return li


def new_Euler(n):
    p = obb_judge(n)
    if n in p:
        return n - 1
    else:
        ret = 0 + n
        for i in range(0, len(p)):
            if ret % p[i] == 0:
                n -= n // p[i]
                # print('n: ',n)
            while ret % p[i] == 0:
                ret //= p[i]
                # print('ret: ',ret)
        return n

  1. p p p 是素数,计算 ( p − 1 ) ! m o d    p (p-1)!\mod p (p1)!modp,并找出规律,写成定义,并给出证明。
# 测试计算使用代码
import math


def obb_judge(n):
    li = []
    for num in range(2, n + 1):
        flag = 0
        for i in range(2, int(math.sqrt(num)) + 1):
            if num % i == 0:
                flag = 1
            # print('{} % {} == {}'.format(num, i, num % i))
        if flag == 0:
            li.append(num)
    return li


def factorial(m):
    re = 1
    for i in range(1, m + 1):
        re *= i
    return re


def fac_to_mode(p):
    if p in obb_judge(p):
        return factorial(p - 1) % p
    else:
        return -1


if __name__ == '__main__':
    m = eval(input('p: '))
    for j in range(2, m):
        if fac_to_mode(j) != -1:
            print('#{}: {}'.format(j, fac_to_mode(j)))

【补充】这里发现一个令人疑惑的地方,直接使用 in range (2,int(math.sqrt(n))+1) 的条件会误判 5、7、11等等数为因子的倍数为素数,因此这里使用上一段代码的判定方式。

# 运行结果:
p: 128
#2: 1
#3: 2
#5: 4
#7: 6
#11: 10
#13: 12
#17: 16
#19: 18
#23: 22
...
#103: 102
#107: 106
#109: 108
#113: 112
#127: 126

这里我们发现对 ( p − 1 ) ! m o d    p = p − 1 (p-1)!\mod p = p-1 (p1)!modp=p1 于是原问题变为:求证:当 p p p 为素数时, ( p − 1 ) ! ≡ ( p − 1 ) ( m o d    p ) (p-1)!\equiv(p-1)(\mod p) (p1)!(p1)(modp) 且只当 p p p 为素数时(威尔逊定理)

证明:
(1) p p p 为素数时,总有 ( p − 1 ) ! ≡ ( p − 1 ) ( m o d    p ) (p-1)!\equiv(p-1)(\mod p) (p1)!(p1)(modp)

( p − 1 ) ! ≡ ( p − 1 ) ( m o d    p ) (p-1)!\equiv(p-1)(\mod p) (p1)!(p1)(modp) ( p − 1 ) ! ≡ − 1 ( m o d    p ) (p-1)!\equiv{-1}(\mod p) (p1)!1(modp) 等同
对于 p = 2 p=2 p=2 此结论总成立
对于 p = 3 p=3 p=3 此结论也显然成立

而其余质数 p p p 满足 p m o d    2 = 1 , p ≥ 5 p\mod 2=1, p\geq 5 pmod2=1,p5
假设一数 1 < a ≤ ( p − 1 ) 1 < a \leq (p-1) 1<a(p1) (因为 a a a 总是在此区间内存在 [ p p p 为素数])
那么: a ∈ M ( M = { x ∣ 2 ≤ x ≤ ( p − 2 ) } ) a\in M (M=\{x|2\leq x\leq (p-2)\}) aM(M={x∣2x(p2)})
再设: N = { y ∣ y = x ∗ a , x ∈ M } N=\{y|y=x*a,x\in M\} N={yy=xa,xM}
那么显然可知:由 M → N M \to N MN 是双射的(当 a a a 是常数时)
设方程 x ∗ a ≡ 1 ( m o d    p ) x*a\equiv 1(\mod p) xa1(modp) ,由以上结论可知:
我们只能找到一个 x x x 与一个 a a a 一一对应此方程: x ∗ a ≡ 1 ( m o d    p ) x*a\equiv 1(\mod p) xa1(modp)
所以有以下所有方程:
1 ∗ a 1 m o d    p = 1 1*a_1\mod p =1 1a1modp=1
2 ∗ a 2 m o d    p = 1 2*a_2\mod p=1 2a2modp=1

( p − 2 ) ∗ a p − 2 m o d    p = 1 (p-2)*a_{p-2}\mod p=1 (p2)ap2modp=1
又因 p p p 为素数:
所以总有: g c d ( a i , p ) = 1 gcd(a_i,p)=1 gcd(ai,p)=1
那么对于上述方程都有: n ∗ a n ≡ n ( m o d    p ) n*a_n\equiv n(\mod p) nann(modp)
对于所有 n n n 都有 gcd ⁡ ( n , p ) = 1 \gcd(n,p)=1 gcd(n,p)=1
所以由乘法原理: ( p − 1 ) ! ≡ ( p − 1 ) ( m o d    p ) (p-1)!\equiv(p-1)(\mod p) (p1)!(p1)(modp) 成立
原式得证

(2) ( p − 1 ) ! ≡ ( p − 1 ) ( m o d    p ) (p-1)!\equiv(p-1)(\mod p) (p1)!(p1)(modp) 成立时, p p p 为素数
假设: p p p 不为素数,那么必然有 ∃ a , b ≤ p \exist a, b\leq p a,bp
那么:原式为 ( p − 1 ) ! = 1 ∗ 2 ∗ 3 ∗ . . . ∗ a ∗ . . . ∗ b ∗ . . . ∗ ( p − 1 ) m o d    p (p-1)!=1*2*3*...*a*...*b*...*(p-1)\mod p (p1)!=123...a...b...(p1)modp
因此其中总存在: gcd ⁡ ( a ∗ b , p ) ≠ 1 \gcd(a*b,p)\neq 1 gcd(ab,p)=1
所以总有: ( p − 1 ) ! ≡ 0 ( m o d    p ) (p-1)!\equiv0(\mod p) (p1)!0(modp)
与原式等同的 ( p − 1 ) ! ≡ − 1 ( m o d    p ) (p-1)!\equiv{-1}(\mod p) (p1)!1(modp) 不符
所以 p p p 必然为素数

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值