歐拉定理證明詳解

一、歐拉定理是什麼

歐拉定理(Euler’s theorem)是一條數論中的基本定理,它表明如果a和n是正整數,且它們互質,則a的歐拉函數(Euler function)φ(n)滿足:a^φ(n) ≡ 1(mod n)。

其中,φ(n)表示小於等於n的正整數中與n互質的數的數量(歐拉函數)。例如,φ(7) = 6,φ(8) = 4,φ(9) = 6。

二、歐拉定理的證明

歐拉定理的證明需要用到一些數學知識,包括費馬小定理、唯一分解定理等。下面我們將從多個方面來闡述歐拉定理的證明。

三、費馬小定理與歐拉定理

費馬小定理是歐拉定理的一個基礎:如果p是一個質數,a是不是p的倍數的正整數,則a^(p-1) ≡ 1 (mod p)。

int fastPower(int base, int exponent, int mod) {
    int ans = 1 % mod;
    while (exponent) {
        if (exponent & 1) {
            ans = (long long) ans * base % mod;
        }
        base = (long long) base * base % mod;
        exponent >>= 1;
    }
    return ans;
}

bool isPrime(int n) {
    if (n <= 2) {
        return n == 2;
    }
    for (int i = 1; i <= 5; ++i) {
        int a = rand() % (n - 2) + 2;
        if (fastPower(a, n - 1, n) != 1) {
            return false;
        }
    }
    return true;
}

int main() {
    int p = 113; // 選一個質數p
    for (int i = 1; i < p; ++i) {
        if (!isPrime(i)) {
            continue;
        }
        if (fastPower(i, p - 1, p) != 1) {
            printf("Oops! a = %d is not p-1's residue\n", i);
        }
    }
    return 0;
}

四、唯一分解定理

唯一分解定理指出,任何一個大於1的自然數,都可以分解成多個質因數的積,且這種分解方式唯一。

int main() {
    int n = 100;
    vector<pair> factors; // 分解結果
    for (int i = 2; i <= n; ++i) {
        if (n % i == 0) {
            int cnt = 0;
            while (n % i == 0) {
                ++cnt;
                n /= i;
            }
            factors.emplace_back(i, cnt);
        }
    }
    for (auto p: factors) {
        printf("%d ^ %d\n", p.first, p.second);
    }
    return 0;
}

五、Euler Function

歐拉函數φ(n)表示小於等於n的正整數中和n互質的數的個數。φ(n)可以通過唯一分解定理來計算,假設n = p1^k1 * p2^k2 * p3^k3 * … * pm^km,則:φ(n) = (p1-1)*p1^(k1-1) * (p2-1)*p2^(k2-1) * … * (pm-1)*pm^(km-1)。

int eulerPhi(int n) {
    int ans = n;
    for (int i = 2; i * i  1) {
        ans = ans / n * (n - 1);
    }
    return ans;
}

int main() {
    int n = 10; // 求10的歐拉函數
    printf("%d\n", eulerPhi(n));
    return 0;
}

六、歐拉定理的證明過程

1. 特殊情況

當n=1時,φ(1)=1,因此a^φ(1)=1,原式成立。

當a=1時,a^φ(n)=1^φ(n)=1,原式成立。

2. 通用情況

設gcd(a,n)=1,將n分解質因數,有n = p1^k1 * p2^k2 * … * pm^km。根據互質的定義,a^φ(n)與n沒有公共質因數,因此a^φ(n) mod pi^ki = 1 mod pi^ki(1≤i≤m)。

因此,只需對每個pi^ki證明即可。設n=pi^ki,則φ(n)=pi^(ki-1) * (pi-1),原式可寫成a^(pi^(ki-1) * (pi-1) * s) ≡ 1(mod pi^ki),其中s={p1^(k1-1) * (p1-1) * p2^(k2-1) * (p2-1) * … * pm^(km-1) * (pm-1)}/pi^(ki-1)

2.1. 當pi為奇素數時

由費馬小定理可得,a^(pi-1) ≡ 1(mod pi),故:

a^(pi^(ki-1) * (pi-1) * s) ≡ (a^((pi-1)*s))^(pi^(ki-1)) ≡ 1^(pi^(ki-1)) ≡ 1(mod pi^ki)

2.2. 當pi=2時

當k=1時,φ(2)=1,故a^φ(2)=1,原式成立。

當k>=2時,n=2^k,φ(n)=2^(k-1),因此:

a^(2^(k-1) * s) ≡ (a^(2^(k-2) * s))^2 ≡ … ≡ ((a^s)^2)^2 ≡ … ≡ 1(mod 2^k)

3. 證明完畢

綜上所述,對於任意的正整數a、n,若gcd(a,n) = 1,則有:a^φ(n) ≡ 1(mod n),即歐拉定理成立。

七、完整代碼示例

#include <bits/stdc++.h>

using namespace std;

int fastPower(int base, int exponent, int mod) {
    int ans = 1 % mod;
    while (exponent) {
        if (exponent & 1) {
            ans = (long long) ans * base % mod;
        }
        base = (long long) base * base % mod;
        exponent >>= 1;
    }
    return ans;
}

bool isPrime(int n) {
    if (n <= 2) {
        return n == 2;
    }
    for (int i = 1; i <= 5; ++i) {
        int a = rand() % (n - 2) + 2;
        if (fastPower(a, n - 1, n) != 1) {
            return false;
        }
    }
    return true;
}

int eulerPhi(int n) {
    int ans = n;
    for (int i = 2; i * i  1) {
        ans = ans / n * (n - 1);
    }
    return ans;
}

int main() {
    srand(time(nullptr));
    int p = 113; // 選一個質數p
    for (int i = 1; i < p; ++i) {
        if (!isPrime(i)) {
            continue;
        }
        if (fastPower(i, p - 1, p) != 1) {
            printf("Oops! a = %d is not p-1's residue\n", i);
        }
    }
    int n = 10; // 求10的歐拉函數
    printf("%d\n", eulerPhi(n));
    return 0;
}

原創文章,作者:LCRR,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/147784.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
LCRR的頭像LCRR
上一篇 2024-11-02 13:12
下一篇 2024-11-02 13:12

相關推薦

  • Python餘弦定理求第三邊長

    本文將從以下幾個方面對Python餘弦定理求第三邊長進行詳細闡述: 一、餘弦定理簡介 餘弦定理是解決三角形問題的基本工具之一,它可以用於求解三角形的邊長和角度。其公式如下: c² …

    編程 2025-04-29
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分散式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變數讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性感測器,能夠同時測量加速度和角速度。它由三個感測器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web伺服器。nginx是一個高性能的反向代理web伺服器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25

發表回復

登錄後才能評論