我的博客和笔记我的博客和笔记
首页
文章
  • TurboLink
  • TinyEncrypt
  • UnrealStyleGuide
  • AxTrace
  • Cyclone
  • 数学相关
  • 图形学
  • 密码学
  • 编程语言
关于
GitHub
首页
文章
  • TurboLink
  • TinyEncrypt
  • UnrealStyleGuide
  • AxTrace
  • Cyclone
  • 数学相关
  • 图形学
  • 密码学
  • 编程语言
关于
GitHub
  • 我的文章

    • 从抛币协议到智能合约

      • Part1
      • Part2
    • JPEG算法解密

      • Part1
      • Part2
      • Part3
      • Part4
      • Part5
      • Github
    • SPH算法简介

      • Part1
      • Part2
      • Part3
      • Part4
      • Github
    • 赌博中的数学:Martingle策略
    • 如何生成一个随机的圆形
    • 一个简单的DH密钥协商算法的实现
    • 如何计算线段和圆的交点
    • 一道数学趣题
    • 斐波那契数列和1/89
    • 匀速贝塞尔曲线运动的实现

      • Part1
      • Part2
  • 开源项目

    • TurboLink
    • TinyEncrypt
    • UnrealStyleGuide
    • AxTrace
    • Cyclone
  • 学习笔记

    • 数学相关

      • 常用数学符号
      • 群
      • 数论(一)
        • 1.同余系统
          • 1.1 最大公约数(Greatest common divisor)
          • 1.2 最小公倍数(Least Common Multiple)
          • 1.3 模运算
          • 1.4 同余等式
        • 2.中国剩余定理
          • 2.1 孙子算经中的问题
          • 2.2 数学解释
          • 2.3 直觉
          • 2.4 数学表达
          • 2.5 举例,孙子算经中的问题
        • 3.欧拉定理
          • 3.1 欧拉函数
          • 3.2 欧拉定理
          • 3.3 模反元素(逆元)
          • 3.4 费马小定理
        • 4.扩展碾压相除法
          • 4.1 裴蜀定理
          • 4.2 算法实现
      • 数论(二)
      • 数论(三)
      • 概率
    • 密码学

      • RSA
      • 抛币协议
      • 智能扑克协议
    • 图形学

      • 数学基础

        • 矢量
        • 矩阵
        • 立体角
        • 几何变换(一)
        • 几何变换(二)
        • 法线变换
        • 摄像机变换
      • 光照模型

        • 传统光照模型
        • 光度学
        • 双向反射分布函数(BRDF)
        • 微平面理论(一)
        • 微平面理论(二)
        • 微平面理论(三)
        • 光照方程
      • 环境光渲染

        • 环境光渲染(一)
        • 环境光渲染(二)
    • 编程语言

      • JavaScript

        • 环境搭建
        • 基本语法
        • 函数
        • 对象和类

数论(一)


1.同余系统

1.1 最大公约数(Greatest common divisor)

1.1.1 gcd(x,y)表示x和y的最大公约数,也叫最大公因数,例如gcd(6,15)=3

欧几里得对“公约”的解释,给定两条长度不同的线段 a 和 b ,如果能够找到第三条线段 c ,它既可以度量 a ,又可以度量 b ,我们就说 a 和 b 是可公约的(commensurable),最大可能的c就是a和b的最大公约数

1.1.2 如果两个数的最大公约数是1,那么这两个数成是互质的(relatively prime),比如说gcd(7,10)=1

互质的几何意义,如果 a 和 b 互质,这就意味着分数 a / b 已经不能再约分了,意味着 a × b 的棋盘的对角线不会经过中间的任何交叉点,意味着循环长度分别为 a 和 b 的两个周期性事件一同上演,则新的循环长度最短为 a × b 。

1.1.3 最大公约数一般使用欧几里得碾压相除法(Euclidean algorithm)计算

欧几里得算法使用了如下递归式

gcd(n,m)=gcd(m,nmodm)

gcd(69,21)=3的计算方法
gcd(69,21)=gcd(21,6)=gcd(6,3)=3

1.2 最小公倍数(Least Common Multiple)

lcm(x,y)表示x和y的最小公倍数,例如lcm(45,30)=90

gcd(x,y)×lcm(x,y)=xy

1.3 模运算

1.3.1 xmodn 是x除以n的余数,例如13mod5=3

1.3.2 模运算符合交换律,结合律和分配律

(a+b)modn=((amodn)+(bmodn))modn(a−b)modn=((amodn)−(bmodn))modn(a×b)modn=((amodn)×(bmodn))modn(a×(b+c))modn=(((a×b)modn)+((a×c)modn))modn

1.3.3 如何计算axmodn

如果x是2的幂次方,例如16,那么 a16modn=(((a2modn)2modn)2modn)2modn
如果x不是2的幂次方,例如a25modn
25=16+8+1=(2+1)×2×2×2+1
a25=a(2+1)×2×2×2+1=(((a2×a)2)2)2×a
a25modn=(((((((a2modn)×a)modn)2modn)2modn)2modn)×a)modn

1.4 同余等式

如果a和b除n的余数相同,那么记为a≡b(modn) 如果a≡b(modn),那么b≡a(modn) 如果a≡b(modn),b≡c(modn),那么记为a≡b≡a(modn) 如果a1≡b1(modm),a2≡b2(modm),…,an≡bn(modm),那么

a1+a2+…+an≡(b1+b2+…+bn)(modm)a1a2…an≡(b1b2…bn)(modm)

2.中国剩余定理

2.1 孙子算经中的问题

“今有物,不知其数。三、三数之,剩二;五、五数之,剩三;七、七数之,剩二。问物几何?答曰:二十三。”
《孙子算经》卷下第二十六问

2.2 数学解释

有m个两两互质的数,其乘积为P,有一个未知数M,如果我们已知M分别除以这m个数所得的余数,那么在0到P–1的范围内,我们可以唯一地确定这个M

2.3 直觉

两个除数的情况为例,假设两个除数分别是 4 和 7。下表显示的就是各自然数除以 4 和除以 7 的余数情况

i012345678910111213141516171819
imod401230123012301230123
imod701234560123456012345
i2021222324252627282930313233343536373839
imod401230123012301230123
imod760123456012345601234

可以看出,imod4,imod7的结果以4×7=28长度循环,每种特性的组合都在这28个结果中出现,所以一旦确定imod4和imod7的余数,就一定能唯一判定出i

2.4 数学表达

已知m1,m2,…,mk是两两互质的正整数,有未知数x满足同余方程组

x≡a1(modm1)x≡a2(modm2)⋯x≡ak(modmk)

那么

x=(a1M1M1−1+a2M2M2−1+…+akMkMk−1)modM

其中M=m1⋅m2⋅…⋅mk,Mi=M/mi, 而Mi−1是Mi的逆元(见3.3节),也就是MiMi−1≡1(modmi)

2.5 举例,孙子算经中的问题

m1=3,m2=5,m3=7,a1=2,a2=3,a3=2,那么

M=3×5×7=105M1=5×7=35M2=3×7=21M3=3×5=15M1−1=35ϕ(3)−1mod2=2M2−1=21ϕ(5)−1mod5=1M3−1=15ϕ(7)−1mod7=1x=(2×35×2+3×21×1+2×15×1)mod105=23

3.欧拉定理

3.1 欧拉函数

任意给定正整数n,小于等于n的正整数之中,与n构成互质关系的数的个数记为ϕ(n)

ϕ(1)=1

如果p是质数,那么ϕ(p)=p−1, ϕ(pk)=pk−pk−1
如果n=pq,ϕ(n)=ϕ(p)ϕ(q)=(p−1)(q−1)
如果n=p1k1p2k2…prkr,那么

ϕ(n)=n(1−1p1)(1−1p2)…(1−1pr)

比如ϕ(1323)=ϕ(33×72)=1323(1−13)(1−17)=756

3.2 欧拉定理

如果a和n互质,那么

aϕ(n)≡1(modn)

3.2.1

ϕ(10)=4,7ϕ(10)≡74≡2401≡1(mod10)

3.2.2

74k≡(74)k≡74×74×…×74⏟k≡1×1×…×1⏟k(modn),所以74k尾数一定是1

3.2.3

由于74k≡1(mod10),72≡9(mod10), 所以7222≡74×55+2≡(1×1×…×1⏟55×9)(mod10),所以7222尾数为9

3.3 模反元素(逆元)

如果a和n互质,那么ax≡1(modn)有解,x称为a模n的模反元素

3.3.1

用欧拉定理证明aϕ(n)≡a×aϕ(n)−1≡1(modn),所以aϕ(n)−1+kn都是a的模反元素

3.3.2

例如求解同余方程3x≡1(mod11),那么3ϕ(11)−1≡39≡19683≡4(mod11),所以4+11k都是同余方程的解

3.4 费马小定理

根据欧拉定理,当p是一个质数时,对于任意正整数a,有ap≡a(modp),如果p∤a,那么

ap−1≡1(modp)

4.扩展碾压相除法

4.1 裴蜀定理

对于方程ax+by=d,当且仅当gcd(a,b)∣d时,方程有整数解

4.2 算法实现

对于方程ax+by=gcd(a,b), 假设方程bx+(amodb)y=gcd(a,amodb)有整数解(x′,y′),由于gcd(a,b)=gcd(b,amodb),可以得到

ax+by=bx′+(amodb)y′=ay′+b(x′−⌊ab⌋y′)

所以

x=y′,y=x′−⌊ab⌋y′

用递归算法实现

pair<int,int> exgcd(int a,int b){
    if(b == 0)return make_pair(1,0);
    pair<int,int>temp = exgcd(b,a%b);
    pair<int,int>ans = make_pair(temp.second,temp.first-(int)(a/b)*temp.second);
    return ans;
}
Prev
群
Next
数论(二)