Try   HackMD

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
2020 競技程設教材 HackMD Book
Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

2020 Week 14: Number theory

在演算法競賽中,通常涉及的數論大部份是整數代數性質

Greatest Common Divisor

中譯 最大公因數,以下簡稱 GCD
給定整數

a,b,它倆各自有自己的因數[1],取相同的因數中最大的數,即最大公因數
gcd(a,b)

#include<algorithm> 有內建的 __gcd 函數

練習:

CODEFORCES 1155C Alarm Clocks Everywhere
CODEFORCES 1133D Zero Quantity Maximization
CODECHEF SnackDown 2019 Round 1A Chef and Periodic Sequence
CODEFORCES 1107D Compression

GCD 性質

  • gcd(a,b)=gcd(b,a)
  • gcd(a,0)=|a|
  • gcd(a,b)=gcd(a,b%a)

% 是 C++ 中的取餘數運算,表示存在
k
滿足
0b%a=bka<a

Euclidean algorithm

輾轉相除法

給定整數

a,b 求出
gcd(a,b)

a0=a,b0=b,根據 GCD 性質
gcd(a0,b0)=gcd(b0%a0=b1,a0)gcd(b1,a0)=gcd(a0%b1=a1,b1)gcd(a1,b1)=gcd(b1%a1=b2,a1)gcd(ai,bi)=gcd(bi%ai=ai+1,bi)gcd(0,bn)=|bn|

練習:

證明上述過程

gcd參數比參數要先變為
0

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
[2]

綜合上面過程,實作程式碼:

int gcd(int a, int b)
  { return a? gcd(b%a, a) : b; }

練習:

UVa OJ 10407 Simple division

Bezout’s Theorem

對於所有整數

a,b,存在整數
x,y
使得
ax+by=gcd(a,b)

練習:

LeetCode 365 Water and Jug Problem

Extended Euclidean algorithm

給定整數

a,b 求出整數
x,y
滿足
ax+by=gcd(a,b)

g=gcd(0,g)=gcd(a,b),配合 Bezout’s Thm 得到:
0xn+gyn=g

明顯的,
xnZ,yn=1

xn 為任意整數

而根據 GCD 性質

gcd(ai,bi)=gcd(bi%ai,ai)
以及
bi%ai=bibiaiai

得到
g=xj(bi%ai)+yjai=xj(bibiaiai)+yjai=xjbi+(yjbiaixj)ai

也就是說

g=aixj1+biyj1 for {xj1=yjbiaixjyj1=xj

綜合上述過程:

int gcd(int a, int b, int &x, int &y) {
  if(!a) {
    x = 0, y = 1; // x 為任意整數
    return b;
  }

  int g = gcd(b%a, a, x, y);
  int xp = y - b/a * x, yp = x; // p := previous
  x = xp, y = yp;

  return g;
}

練習:

UVa OJ 10104 Euclid Problem
UVa OJ 10090 Marbles
UVa OJ 10413 Crazy Savages

Modular arithmetic (同餘運算)

在競賽中若計算結果超出了數值範圍外,則通常會要求結果對某個數字取餘數
所以得熟悉取完餘數後的數字們之間的關係運算

練習:

CODEFORCES 1165A Remainder

數字們都對

n 取餘數後,它們就處於"
n
"的狀態下了
a
除以
n
的餘數記做
a (mod n)

記得檢查若 a 為負數的情況

a (mod n)
b (mod n)
相等,則記
ab (mod n)
,稱
a,b
同餘關係
也就是說
kZaa+kn (mod n)

可將括號內看作數字們處於一個特定狀態下,而模

n 通常會省略括號

並且若

abmodncdmodn

a+cb+dmodna×cb×dmodn

練習:

CODEFORCES 1178C Tiles
CODEFORCES 1151C Problem for Nazar
CODEFORCES 1165E Two Arrays and Sum of Functions[3]

歐拉定理

如果

a,n 互質[4],那麼
aϕ(n)1modn

這裡
ϕ(n)
是與
n
互質且小於
n
正整數的個數

例如

1,5
6
互質,
ϕ(6)=2

費馬小定理

如果

a,p 互質,且
p
質數,那麼
ap11modp

是歐拉定理的特例

模反元素

數字們模

n 後,對於加法、減法、乘法,其性質都與以往差不多,但對數字做除法卻不盡人意

注意,在同餘運算中只會有整數,有理數無理數等其他數不會出現

反元素指的是元素與其運算後為單位元素的元素
例如:

  • 整數
    a
    法反元素為
    a
  • 整數
    a
    法反元素為
    1a

而元素

a
n
反元素
a1
滿足
aa11modn

根據 Bezout's Thm

  • ax+ny=gcd(a,n)=1
    在模
    n
    ax1modn
  • ax+ny=gcd(a,n)1
    在模
    n
    ax1modn

也就是說

gcd(a,n)=1 (互質),
a
才擁有模
n
反元素

求出模
n
反元素

  • n
    質數時:

根據費馬小定理

aan21modn
所以
an2
a
的模反元素

下週教的快速求冪演算法能在

O(log2n) 得到
an2

  • n
    非質數時:

根據 Bezout's Thm

ax+ny=1 ax1modn
可用擴展歐幾里得演算法找到
x=a1

練習:

ZERO JUDGE a289 Modular Multiplicative Inverse
CODEFORCES 300C Beautiful Numbers
NCKU OJ 22 爬樓梯 k
CODEFORCES 935D Fafa and Ancient Alphabet

孫子定理

給定

a1,a2,,an 以及
m1,m2,,mn
,其中任意
mi,mj
gcd(mi,mj)=1

求滿足下式的

x 值為何?
xa1modm1xa2modm2xanmodmn

x 要與
ai
都有關係,所以設
x=a1y1+a2y2++anyn
,且在模
mi
時為
x=a10++ai1++an0modmi

要仔細思考,怎樣的

yi 才會符合問題中的方程式定義?

小規模觀察,假設

n=2
x
要在

  • m1
    的時候
    (y1,y2)(1,0)
  • m2
    的時候
    (y1,y2)(0,1)

所以模數應當是對應的

yi 因數,即
y1=m2t1
y2=m1t2
,這樣

  • m2
    的時候
    y10
  • m1
    的時候
    y20

接著思考

y11
y21
的狀況

  • y1=m2t11modm1
    ,可推出
    t1
    m2
    的模
    m1
    反元素
  • y2=m1t21modm2
    ,可推出
    t2
    m1
    的模
    m2
    反元素

最後整理上述有

x=(m2t1)a1+(m1t2)a2+km1m2
其中
k
為任意整數

加法最後項

km1m2 表示
x
有多種解,是根據同餘關係
aa+kmmodm

根據上述的提示,可以嘗試推廣當

n>2
x
的解
如法泡製的將
mi
作為對應的
yj
因數
,即
jiyj0modmi

所以定義
Mi=k=1nmkmi
[5],該
yi
可推廣為
yi=Miti
,且
ti
Mi
的模
mi
反元素

於是推出原問題方程組的解為

x=(M1t1)a1+(M2t2)a2++(Mntn)an+kM=k=1n(Miti)ai+kM
其中
k
為任意整數,且
M=k=1nmk

練習:

ZERO JUDGE d791 00756 - Biorhythms
CODEFORCES 687B Remainders Game
Kattis generalchineseremainder Chinese Remainder Theorem (non-relatively prime moduli)
TIOJ 1459 B.完全子圖


  1. 整數

    n因數為可整除
    n
    的數 ↩︎

  2. Wikipedia/ 輾轉相除法的演示動畫 ↩︎

  3. 請留意 mod 後大小關係會改變QQ ↩︎

  4. 最大公因數為

    1 ↩︎

  5. 連乘符號,也就是說
    k=1nmk=m1×m2××mn
    ↩︎