1. 程式人生 > 其它 >數學/數論專題-學習筆記:尤拉函式

數學/數論專題-學習筆記:尤拉函式

目錄

一些 update

update 2021/5/20:刪除了一些話語,精煉了一些語言。

update 2021/8/11:發現擴充套件性質 3 的證明有問題,講解的也不清不楚,已經更正證明。

update 2021/8/12:發現基本性質 1 有誤,已經更正。

update 2021/8/24:根據最近所學到的東西,新增擴充套件性質 4。

update 2021/12/14:更新了一下前言部分與簡單性質部分,往基本性質 2 中加了一句不影響理解但有幫助的話,添加了擴充套件性質 2 的第二種證明,更新了摘要部分。

1. 前言

本篇博文將會重點講解尤拉函式,數論入門級別的函式。

在此之前,您需要知道以下幾個符號:

  1. \(d | n\) 表示 \(d\) 能整除 \(n\),等價於 \(d\)\(n\) 的因數。\(d \nmid n\) 表示 \(d\) 不能整除 \(n\),等價於 \(d\) 不是 \(n\) 的因數。
  2. \(\sum_{i=1}^{n}=a_i\) 是求和符號,表示所有 \(a_i\) 的和。
  3. \(\prod_{i=1}^na_i\) 是求積符號,表示所有 \(a_i\) 的積。
  4. \([A]\) 表示當 \(A\) 成立時 \([A]=1\),否則 \([A]=0\),比如 \([5=1]=0\)
    ,\([6=6]=1\)

本文預設讀者學過質數及其簡單性質與應用,包括但不限於分解質因數與線性篩/尤拉篩。

若無特殊說明,本文預設所有數都是正整數。

2. 前置定理

簡單定理:

  • \(\gcd(a+mb,b)=\gcd(a,b)\)
  • \(\gcd(a,b)=d \Leftrightarrow \gcd(\dfrac{a}{d},\dfrac{b}{d})=1\)
  • 一些別的定理(比如輾轉相除法之類的)

兩個關鍵定義:

積性函式:假設一個函式滿足以下條件:

\[f(a \times b) = f(a) \times f(b),\gcd(a,b)=1 \]

那麼稱這個函式為積性函式。也就是說,積性函式的定義域內任取兩個互質的數 \(a,b\)

,必有 \(f(a \times b)=f(a) \times f(b)\)

比如我們熟知的一次函式 \(f(x)=x\) 就是積性函式。

完全剩餘系:我們知道一個數模 \(n\) 共有 \(n\) 種結果,為 \(0,1,2,...,n-1\)

那麼我們將其看成 \(n\) 類,第 \(i\) 類結果為 \(i\),那麼從每一類中取出一個數,這些數構成的集合就叫做模 \(n\) 的完全剩餘系。

比如說 \(\{51,22,63,104,200\}\) 就是模 \(5\) 的一個完全剩餘系,因為其模 \(5\) 的結果為 \(\{1,2,3,4,0\}\)

一個簡單的性質:假設 \(t < a\)\(\gcd(t,a)=1\),那麼 \(t,2t,3t,...,(a-1)t\) 構成了模 \(a\) 的完全剩餘系,且 \(\forall i \in N\),\(i+t,i+2t,i+3t,...,i+(a-1)t\) 也構成了模 \(a\) 的完全剩餘系。

3. 定義

首先來講講尤拉函式是個啥:

定義:在數論中,記尤拉函式 \(\varphi(n)\) 表示在 \([1,n-1]\) 內幾個數與 \(n\) 互質。

更加嚴謹的,有:\(\varphi(n)=\sum \limits_{i=1}^{n}[\gcd(i,n)=1]\)

這就是尤拉函式。

4. 性質

強烈建議讀者拿出紙筆自己寫一些,可以更方便的理解。

尤拉函式的基本性質:

  • 基本性質 1:若 \(p\) 為質數,那麼 \(\varphi(p)=p-1\)。特別的,\(\varphi(1)=1\)
  • 基本性質 2:設 \(n = p^k\)\(p\) 為質數,那麼: \[\varphi(n)=n-\dfrac{n}{k}=n-p^{k-1}=p^{k-1} \times (p-1)=p^{k-1} \times \varphi(p) \] 其中 \(\varphi(p^k)=p^k-p^{k-1}=p^{k-1} \times (p-1)\) 用的會比較多。
  • 基本性質 3:尤拉函式是積性函式。
  • 基本性質 4:對於數 \(n\),將其質因數分解為 \(\prod_{i=1}^{k}{p_i}^{r_i}\),那麼: \[\varphi(n)=\prod_{i=1}^{k}\varphi(p_i^{r_i})=\prod_{i=1}^{k}(p_i^{r_i-1} \times (p_i-1))=n \times \prod_{i=1}^{k}(1-\dfrac{1}{p_i}) \]

接下來一條一條證明。


基本性質 1:

\(p\) 為質數的時候,顯然有 \([1,p-1]\) 內所有正整數都與 \(p\) 互質,那麼由定義:\(\varphi(p)=p-1\)。因為 1 和 1 互質,那麼 \(\varphi(1)=1\)


基本性質 2:

引理:假設在 \([1,n]\) 範圍內有一個數 \(x\)\(n\) 互質,那麼 \(x\)\(n\) 互質的充要條件是 \(x\)\(p\) 互質。引理正確性顯然。

那麼考慮正難則反,也就是:\(\varphi(n)=n-\sum\limits_{i=1}^{n}[gcd(i,n) \ne 1]\)

也就是 \(n\) 減去與其不互質的數。

而要使 \(i\)\(n\) 不互質,考慮到 \(p\) 是質數,那麼必然有 \(i\)\(p\) 不互質。

那麼 \([1,n]\) 範圍內有幾個數與 \(p\) 不互質呢?\(\dfrac{n}{p}\) 個。

於是又因為 \(n=p^k\),且 \(\varphi(p)=p-1\),那麼:

\[\varphi(n)=n-\dfrac{n}{k}=n-p^{k-1}=p^{k-1} \times (p-1)=p^{k-1} \times \varphi(p) \]

基本性質 3:

不妨假設 \(n=a \times b\),其中 \(\gcd(a,b)=1\)

那麼要證明的就是 \(\varphi(n)=\varphi(a) \times \varphi(b)\)

接下來考慮將 \(a \times b\) 個數按照矩陣鋪開,也就是長這樣:

\(\begin{matrix}1&2&\cdots&a-1&a\\a+1&a+2&\cdots&2a-1&2a\\\vdots&\vdots&\ddots&\vdots&\vdots\\(b-1) \times a+1&(b-1) \times a+2&\cdots&b \times a - 1&b \times a\\\end{matrix}\)

那麼顯然的,對於每一列的數而言,這一列的所有數模 \(a\) 的結果是相同的。

那麼考慮這 \(a\) 列,模 \(a\) 的結果就是 \([1,a]\)。這裡為了後續方便,就將模 \(a\)\(0\) 視為模 \(a\)\(a\)

考慮到 \(\gcd(x,n)=1\) 的充要條件為 \(\gcd(x,a)=1,\gcd(x,b)=1\),而使得 \(\gcd(x,a)=1\) 的數總共有 \(\varphi(a)\) 列,因此先將這 \(\varphi(a)\) 列取出來,再做進一步的討論。

比如我們當前取出了第 \(i\) 列,那麼第 \(i\) 列的數就是 \(0a+i,1a+i,2a+i,...,(b-1)a+i\),總共 \(b\) 個數。

於是您會發現這些數構成了模 \(b\) 的完全剩餘系。

  • 證明如下:不妨令 \(a>b\)
    首先顯然有 \(\gcd(a,b)=1\)(否則不符合積性函式的條件),那麼假設 \(a \bmod b = t\),那麼我們可以將數列轉換成如下形式:\(i,i+t,i+2t,...,i+(b-1)t\),而且必有 \(\gcd(t,b)=1\)。於是乎,這些數構成了模 \(b\) 的完全剩餘系。

那麼在這些數當中,有多少數滿足 \(\gcd(x,b)=1\) 呢?因為是完全剩餘系,所以有 \(\varphi(b)\) 個。

上面所有過程對於所有 \(\varphi(a)\) 列均成立,因此 \(\varphi(n)=\varphi(a) \times \varphi(b)\),證畢。


基本性質 4:

考慮到尤拉函式為積性函式且 \(\forall i,j \in [1,k],\gcd(p_i^{r_i},p_j^{r_j})=1\),那麼有:\(\varphi(n)=\prod_{i=1}^{k}\varphi(p_i^{r_i})\)

記得基本性質 2 的連等式嗎?通過第三個式子可以得到:\(\varphi(n)=\prod_{i=1}^{k}(p_i^{r_i-1} \times (p_i-1))\)

然後提取公因數 \(p\),將乘積符號裂成兩項,結合尤拉函式是積性函式,於是就有:

\[\varphi(n)=\prod_{i=1}^{k}(p_i^{r_i} \times (1-\dfrac{1}{p_i}))=\prod_{i=1}^{k}p_i^{r_i} \times \prod_{i=1}^{k}(1-\dfrac{1}{p_i})=n \times \prod_{i=1}^{k}(1-\dfrac{1}{p_i}) \]

證畢。

您會發現其實基本性質 4 可以用來求 \(\varphi(n)\)


尤拉函式的擴充套件性質:

  • 擴充套件性質 1:設 \(n=a \times b,\gcd(a,b) = d \in N_+\),那麼 \(\varphi(n)=\dfrac{\varphi(a) \times \varphi(b) \times d}{\varphi(d)}\)
  • 擴充套件性質 2:\(\forall n \in N_+,n=\sum\limits_{d|n}{\varphi(d)}\)
  • 擴充套件性質 3:設 \(n \in N_+,p\) 為質數,那麼: \[\varphi(n \times p)=\begin{cases}\varphi(n) \times \varphi(p)&p \nmid n\\\varphi(n) \times p&p \mid n\end{cases} \]
  • 擴充套件性質 4:對於一個數 \(n\)\(n \geq 2\)),所有小於 \(n\) 且與 \(n\) 互質的數的和為 \(\varphi(n) \times \dfrac{n}{2}\)

接下來一條一條證明。


擴充套件性質 1:

首先先對 \(a,b,d,n\) 做個質因數分解:

\[a=\prod_{i=1}^{m}p_i^{r_1{_i}},b=\prod_{i=1}^{m}p_i^{r_2{_i}},d=\prod_{i=1}^{m}p_i^{\min(r_1{_i},r_2{_i})},n=\prod_{i=1}^{m}p_i^{r_1{_i}+r_2{_i}} \]

然後根據基本性質 4:

\[\varphi(a)=\prod_{i=1}^{m}\varphi(p_i^{r_1{_i}}),\varphi(b)=\prod_{i=1}^{m}\varphi(p_i^{r_2{_i}}) \] \[\varphi(d)=\prod_{i=1}^{m}\varphi(p_i^{\min(r_1{_i},r_2{_i})}),\varphi(n)=\prod_{i=1}^{m}\varphi(p_i^{r_1{_i}+r_2{_i}}) \]

對要證明的式子直接暴力帶入:

\[\prod_{i=1}^{m}\varphi(p_i^{r_1{_i}+r_2{_i}})=\dfrac{\prod_{i=1}^{m}\varphi(p_i^{r_1{_i}}) \times \prod_{i=1}^{m}\varphi(p_i^{r_2{_i}}) \times \prod_{i=1}^{m}p_i^{\min(r_1{_i},r_2{_i})}}{\prod_{i=1}^{m}\varphi(p_i^{\min(r_1{_i},r_2{_i})})} \]

結合基本性質 4 再一次轉化:

左邊:\(\prod_{i=1}^{m}(p_i^{r_1{_i}+r_2{_i}-1} \times (p_i-1))\)

右邊:

\[\dfrac{\prod_{i=1}^{m}(p_i^{r_1{_i}-1} \times (p_i-1)) \times \prod_{i=1}^{m}(p_i^{r_2{_i}-1} \times (p_i-1)) \times \prod_{i=1}^{m}p_i^{\min(r_1{_i},r_2{_i})}}{\prod_{i=1}^{m}(p_i^{\min(r_1{_i},r_2{_i})-1} \times p_i-1)} \]

那麼拆掉乘積符號,右邊分子分母先約去 \(\prod_{i=1}^{m}(p_i-1)\),然後左右兩邊同時除以 \(\prod_{i=1}^{m}(p_i-1)\),再做一個簡單轉化,那麼要證明的式子就變成了:

\[\prod_{i=1}^{m}p_i^{r_1{_i}+r_2{_i}-1}=\prod_{i=1}^{m}p_i^{r_1{_i}+r_2{_i}-2} \times \prod_{i=1}^{m}\dfrac{p_i^{\min(r_1{_i},r_2{_i})}}{p_i^{\min(r_1{_i},r_2{_i})-1}}=\prod_{i=1}^{m}p_i^{r_1{_i}+r_2{_i}-1} \]

證畢。


擴充套件性質 2:

法一:

首先眾所周知,這個等式對於任意 \(n \in N_+\) 恆成立:\(n=\sum_{i=1}^{n}1\)

但是這玩意有什麼用呢?

我們對這個式子做一個變形:\(n=\sum_{d=1}^{n}\sum_{i=1}^{n}[\gcd(n,i)=d]\)

也就是說,我們列舉一個最大公約數 \(d\),然後列舉 \(i \in [1,n]\)

因為 \(\gcd(n,i)\) 的結果一定是唯一的,於是上式一定成立。

再觀察。如果 \(\gcd(n,i)=d\),那麼一定有 \(d \mid n\)

於是對這個式子再做一個變形:\(n=\sum_{d \mid n}\sum_{i=1}^{n}[gcd(n,i)=d]\)

根據最大公約數的這個性質:\(\gcd(a,b)=d \Leftrightarrow \gcd(\dfrac{a}{d},\dfrac{b}{d})=1\)(注意前提:\(d \mid a\)\(d \mid b\)),再做一次轉化:

\[n=\sum_{d \mid n}\sum_{i=1}^{n}([\gcd(\dfrac{n}{d},\dfrac{i}{d})=1] \times [d \mid i]) \]

然後看一下這個:\(\sum_{i=1}^{n}([\gcd(\dfrac{n}{d},\dfrac{i}{d})=1] \times [d \mid i])\)

這個式子中的 \(i \in[1,\dfrac{n}{d}]\)

然後您會發現這實際上就是在判斷 \([1,\dfrac{n}{d}]\) 中有幾個數與 \(\dfrac{n}{d}\) 互質。

這不就是 \(\varphi(\dfrac{n}{d})\) 嗎?

於是等式變為 \(n=\sum_{d \mid n}\varphi(\dfrac{n}{d})=\sum_{d \mid n}\varphi(d)\)

證畢。

法二:

設函式 \(f(n)=\sum_{d \mid n}\varphi(d)\),要證明的就是 \(f(n)=n\)

先證 \(f(n)\) 是個積性函式:

\(n,m\)\(\gcd(n,m)=1\),有:

\(f(n) \times f(m) = \sum_{i \mid n}\varphi(i)\sum_{j \mid m}\varphi(j)\)(定義暴力拆式子)

\(= \sum_{i \mid n}\sum_{j \mid m}\varphi(i) \times \varphi(j)\)(交換求和號)

\(=\sum_{i \mid n}\sum_{j \mid m}\varphi(i \times j)\)

上面這步是因為 \(\gcd(n,m)=1 \Rightarrow \gcd(i,j)=1\),尤拉函式是積性函式所以可以放進去,下面這步也是一樣的。

\(=\sum_{i \times j \mid n \times m}\varphi(i \times j)=f(nm)\)

現在 \(f(n)\) 是積性函式證完了,然後將 \(n\) 質因數分解為 \(\prod_{i=1}^{m}p_i^{k_i}\),於是我們有 \(f(n)=\prod_{i=1}^{m}f(p_i^{k_i})\),現在要證明的就是 \(f(p_i^{k_i})=p_i^{k_i}\)

繼續拆式子:\(f(p_i^{k_i})=\varphi(1)+\varphi(p)+...+\varphi(p_i^{k_i})\)(定義拆式子)

\(=(1-0)+(p-1)+(p^2-p)+...+(p_i^{k_i}-p_i^{k_i-1})\)(利用基本性質二 \(\varphi(p_i^{k_i})=p_i^{k_i}-p_i^{k_i-1}\)

\(=p_i^{k_i}\)(消去同類項)

於是 \(f(p_i^{k_i})=p_i^{k_i}\),證畢,那麼也就證出了 \(f(n)=n\)

證畢。

這個性質運用時有個專門的名字叫尤拉反演。


擴充套件性質 3:

首先考慮 \(p \nmid n\) 的情況。

這個時候肯定有 \(\gcd(p,n)=1\),那麼因為尤拉函式是積性函式,\(\varphi(n \times p)=\varphi(n) \times \varphi(p)\) 必然成立。

接下來考慮 \(p \mid n\) 的情況。

\(x \in [1,pn]\),因為 \(p \mid n\),那麼 \(\gcd(x,pn)=1\) 的充要條件是 \(\gcd(x,n)=1\)(顯然)。

因此 \(\varphi(n \times p)=\sum_{i=1}^{n \times p}[\gcd(i,n)=1]\)

\([1,np]\) 內的數分為 \(p\) 類,第 \(i\) 類的數為 \([n \times i + 1,n \times (i + 1)]\)

因為 \(\gcd(a + bn, n) = \gcd(a, n)\),因此對於第 \(i\) 類中的第 \(j\) 個數 \(n \times i + j\) 而言,\(\gcd(n \times i + j, n) = \gcd(j,n)\)

這樣,每一類中和 \(n\) 互質的數的個數與第一類中和 \(n\) 互質的數的個數相同。

而顯然第一類中和 \(n\) 互質有 \(\varphi(n)\) 個,因此總共與 \(n\) 互質的數有 \(\varphi(n) \times p\) 個。

因此 \(\varphi(n \times p) = \varphi(n) \times p\)

證畢。


擴充套件性質 4:

先看兩個引理:

  • 引理 1:若 \(\gcd(i,n)=1\),則 \(\gcd(n-i,n)=1\)
  • 引理 2:對於 \(n \geq 3\)\(\varphi(n)\) 為偶數。

引理證明如下:

  • 引理 1:考慮反證法。
    \(\gcd(n-i,n)=k \neq 1\),不妨令 \(n=a \times k,n-i=b \times k,a,b \in Z,a>b\),那麼 \(i=n-i=(a-b) \times k\),則有 \(\gcd(i,n)=k \neq 1\),與條件 \(\gcd(i,n)=1\) 不符,因此原假設不成立,則原命題成立。
  • 引理 2:令 \(n=\prod_{i=1}^{,m}p_i^{k_i}\),則 \(\varphi(n)=\prod_{i=1}^{m}(p_i-1) \times p_i^{k_i-1}\)
    考慮單獨提出 \((p_i-1) \times p_i^{k_i-1}\),若 \(p_i\) 為偶數則該式為偶數,若 \(p_i\) 為奇數則 \(p_i-1\) 為偶數,則該式依然是偶數,所以該式無論怎麼樣都是偶數。
    由於一個式子是偶數,那麼這些式子乘起來也當然是偶數。

根據引理 1,在所有小於 \(n\) 並且與 \(n\) 互質的數中,若 \(i\) 存在,則 \(n-i\) 存在,而這兩個數加起來為 \(n\)

接下來分類討論一波:

  • 如果 \(n=2\),手算就可以得到答案是 1,就是 \(\varphi(2) \times \dfrac{2}{2}\)
  • 如果 \(n>2\),根據引理 2,我們可以得知這樣的 \((i,n-i)\) 類的數對有 \(\dfrac{\varphi(n)}{2}\),乘起來得到答案是 \(\varphi(n) \times \dfrac{n}{2}\)

於是擴充套件性質 4 得證。證畢。


至此,所有性質就都證明完畢了,如果還有一些性質筆者沒有提到,煩請在討論區中提出,筆者將會採納,在此表示感謝。

5. 求法

\(\varphi(n)\) 有兩種求法,依據分別是基本性質 4 和擴充套件性質 3。

  • 基本性質 4:用於求單個數的尤拉函式。

根據 \(\varphi(n)=\prod_{i=1}^{k}(p_i^{r_i-1} \times (p_i-1))\),對 \(n\) 做一個質因數分解,然後套公式就可以求了。

複雜度 \(O(\sqrt n)\)

程式碼:

int ksm(int a, int b)
{
    int ans = 1;
    for (; b; b >>= 1, a = a * a)
        if (b & 1) ans = ans * a;
    return ans;
}

int Get(int n)//求單個數尤拉函式
{
    int ans = 1;
    for (int i = 2; i * i <= n; ++i)
    {
        int cnt = 0;
        while (n % i == 0) {n /= i; ++cnt;}
        if (cnt != 0) ans = ans * ksm(i, cnt - 1) * (i - 1);//基本性質 4
    }
    if (n != 1) ans = ans * (n - 1);//n^0=1
    return ans;
}
  • 擴充套件性質 3:用於快速求一連串的尤拉函式。

擴充套件性質 3 可以在 \(O(n)\) 的時間內求出 \([1,n]\) 內的所有尤拉函式值。

利用擴充套件性質 3 求尤拉函式需要用到線性篩。

先把上面這個式子搬過來:$$\varphi(n \times p)=\begin{cases}\varphi(n) \times \varphi(p)&p \nmid n\\varphi(n) \times p&p \mid n\end{cases}$$

考慮在篩質數的時候,假設當前已經篩出了 \(cnt\) 個質數,那麼對於當前數 \(i\),在做 \(O(n \ln \ln n)\) 的線性篩的時候,假設當前列舉到第 \(j\) 個質數 \(p_j\),那麼如果 \(i \bmod p_j=0\),那麼就有 \(\varphi(i \times p_j) = \varphi(i) \times p_j\),否則就有 \(\varphi(i \times p_j) = \varphi(i) \times (p_j-1)\)

因為 \(p_j\) 是個質數,所以 \(\varphi(p_j)=p_j-1\)

根據線性篩篩質數的正確性可知,以上過程一定正確。

程式碼:

vector <int> v;

void Get(int n)//求一連串尤拉函式
{
    book[1] = 1; phi[1] = 1;
    for (int i = 2; i <= n; ++i)
    {
        if (!book[i]) {v.push_back(i); phi[i] = i - 1;}//特別注意質數的初始化!
        for (int j = 0; j < v.size(); ++j)
        {
            if (i * v[j] > n) break;
            book[i * v[j]] = 1;
            if (i % v[j] == 0) {phi[i * v[j]] = v[j] * phi[i]; break;}//多加一步算尤拉函式
            phi[i * v[j]] = phi[i] * (v[j] - 1);//多加一步算尤拉函式
        }
    }
    //最後結果就是 phi[] 陣列
}

6. 總結

尤拉函式的性質如下:

  • 基本性質 1:若 \(p\) 為質數,那麼 \(\varphi(p)=p-1\)。特別的,\(\varphi(1)=1\)
  • 基本性質 2:設 \(n = p^k\)\(p\) 為質數,那麼: \[\varphi(n)=n-\dfrac{n}{k}=n-p^{k-1}=p^{k-1} \times (p-1)=p^{k-1} \times \varphi(p) \] 其中 \(\varphi(p^k)=p^k-p^{k-1}=p^{k-1} \times (p-1)\) 用的會比較多。
  • 基本性質 3:尤拉函式是積性函式。
  • 基本性質 4:對於數 \(n\),將其質因數分解為 \(\prod_{i=1}^{k}{p_i}^{r_i}\),那麼: \[\varphi(n)=\prod_{i=1}^{k}\varphi(p_i^{r_i})=\prod_{i=1}^{k}(p_i^{r_i-1} \times (p_i-1))=n \times \prod_{i=1}^{k}(1-\dfrac{1}{p_i}) \]
  • 擴充套件性質 1:設 \(n=a \times b,\gcd(a,b) = d \in N_+\),那麼 \(\varphi(n)=\dfrac{\varphi(a) \times \varphi(b) \times d}{\varphi(d)}\)
  • 擴充套件性質 2:\(\forall n \in N_+,n=\sum\limits_{d|n}{\varphi(d)}\)
  • 擴充套件性質 3:設 \(n \in N_+,p\) 為質數,那麼: \[\varphi(n \times p)=\begin{cases}\varphi(n) \times \varphi(p)&p \nmid n\\\varphi(n) \times p&p \mid n\end{cases} \]
  • 擴充套件性質 4:對於一個數 \(n\)\(n \geq 2\)),所有小於 \(n\) 且與 \(n\) 互質的數的和為 \(\varphi(n) \times \dfrac{n}{2}\)

尤拉函式的求法如下:

  • 利用基本性質 4:質因數分解後套公式即可。
  • 利用擴充套件性質 3:線上性篩質數的時候多加一步算 \(\varphi(n)\) 即可。

練習:

  1. 獨立寫出 8 個性質及其證明過程。
  2. 獨立寫出 2 種求尤拉函式的程式碼。