📜  Euler 的 Totient 值比自身小 1 的元素计数(1)

📅  最后修改于: 2023-12-03 15:00:37.915000             🧑  作者: Mango

Euler的Totient值比自身小1的元素计数

欧拉函数是一个非常重要的数论函数,它被用来计算模数范围内与给定整数互质的数的个数。欧拉函数也被称为欧拉-φ函数,由欧拉在18世纪初引入,通常用符号φ(n)表示。对于n = 1的情况,φ(1) = 1。

对于大于1的整数n,欧拉函数φ(n)定义为小于或等于n的正整数中与n互质的数的个数。互质的两个整数是指它们没有共同的质因数(除了1以外)的情况。

在这里,我们将介绍一种特别的欧拉函数情况,即Euler的Totient值比自身小1的元素计数。

公式推导

让我们从欧拉函数的定义开始推导它:

  • 定义φ(1) = 1,为了方便讨论,我们考虑n > 1的情况。
  • 对于一个大于1的整数n,我们可以把n分解成它的所有质因数的积:n = 𝑝1^𝑐1⋅𝑝2^𝑐2⋯𝑝𝑘^𝑐𝑘,其中𝑝1,𝑝2, …,𝑝𝑘是不同的质数,𝑐1,𝑐2, ...,𝑐𝑘是它们对应的整数次幂。
  • 对于n中的任意一个质数𝑝𝑖和任意一个小于n的数t,如果gcd(𝑝𝑖,t)=1,那么gcd(n,t)也等于1。
  • 因为n是𝑝1,𝑝2,…,𝑝𝑘的积,所以一个小于n的数t与n互质,当且仅当它与𝑝1,𝑝2,…,𝑝𝑘中的每一个质数都互质。这表明,要确定n的欧拉函数,我们需要确定一个小于𝑝1,𝑝2,…,𝑝𝑘的质数q与它们的乘积的所有数的gcd。因此,我们可以写出:

φ(n) = n × (1 - 1/𝑝1) × (1 - 1/𝑝2) × ... × (1 - 1/𝑝𝑘)

  • 假设我们想要找到一个整数k,使得φ(k) = k - 1,并且假设k有m个不同的质因子。从上面的公式中,我们可以看到,

φ(k) = k × (1 - 1/𝑝1) × (1 - 1/𝑝2) × ... × (1 - 1/𝑝𝑚)

所以,我们需要找到一个整数k,使得

k × (1 - 1/𝑝1) × (1 - 1/𝑝2) × ... × (1 - 1/𝑝𝑚) = k - 1

  • 因为k有m个不同的质因子,所以可以将k表示为k = 𝑝1^𝑎1 × 𝑝2^𝑎2 × ... × 𝑝𝑚^𝑎𝑚,其中𝑎1、𝑎2、…、𝑎𝑚是任意正整数。然后我们可以将上面的等式写成以下形式:

𝑝1^𝑎1 × 𝑝2^𝑎2 × ... × 𝑝𝑚^𝑎𝑚 × (1 - 1/𝑝1) × (1 - 1/𝑝2) × ... × (1 - 1/𝑝𝑚) = 𝑝1^𝑎1 × 𝑝2^𝑎2 × ... × 𝑝𝑚^𝑎𝑚 - 1

  • 将上式的两边连乘,我们得到

𝜙(𝑝1^𝑎1) × 𝜙(𝑝2^𝑎2) × ... × 𝜙(𝑝𝑚^𝑎𝑚) × (1 - 1/𝑝1) × (1 - 1/𝑝2) × ... × (1 - 1/𝑝𝑚) = 𝑝1^𝑎1 × 𝑝2^𝑎2 × ... × 𝑝𝑚^𝑎𝑚 - 1

  • 因为𝜙(𝑝𝑖^𝑎𝑖) = 𝑝𝑖^𝑎𝑖 - 𝑝𝑖^(𝑎𝑖-1) = 𝑝𝑖^𝑎𝑖 × (1 - 1/𝑝𝑖),所以我们得到

𝑝1^𝑎1 × 𝑝2^𝑎2 × ... × 𝑝𝑚^𝑎𝑚 × [𝑝1^(𝑎1-1) × (𝑝1-1)] × [𝑝2^(𝑎2-1) × (𝑝2-1)] × ... × [𝑝𝑚^(𝑎𝑚-1) × (𝑝𝑚-1)] = 𝑝1^𝑎1 × 𝑝2^𝑎2 × ... × 𝑝𝑚^𝑎𝑚 - 1

  • 除𝑝1^𝑎1 × 𝑝2^𝑎2 × ... × 𝑝𝑚^𝑎𝑚,我们得到

[𝑝1^(𝑎1-1) × (𝑝1-1)] × [𝑝2^(𝑎2-1) × (𝑝2-1)] × ... × [𝑝𝑚^(𝑎𝑚-1) × (𝑝𝑚-1)] = 𝑝1^𝑎1 × 𝑝2^𝑎2 × ... × 𝑝𝑚^𝑎𝑚 / (𝑝1^𝑎1 × 𝑝2^𝑎2 × ... × 𝑝𝑚^𝑎𝑚 - 1)

  • 最后,我们可以简洁地写出k的答案,如下:

k = 𝜃(𝑝1^(𝑎1-1) × (𝑝1-1)) × 𝜃(𝑝2^(𝑎2-1) × (𝑝2-1)) × ... × 𝜃(𝑝𝑚^(𝑎𝑚-1) × (𝑝𝑚-1)) × 𝑝1^𝑎1 × 𝑝2^𝑎2 × ... × 𝑝𝑚^𝑎𝑚

其中,𝜃表示欧拉函数。

因此,我们就得到了求解Euler的Totient值比自身小1的元素计数的问题的一般解。

程序实现

以下是Python代码片段,用来计算Euler的Totient值比自身小1的元素计数:

from sympy import primerange, factorint
from functools import reduce

def phi(n):
    return reduce(lambda x, y: x * y, [(1 - 1/p) for p in factorint(n)])

def is_valid(n):
    return phi(n) == n - 1

primes = list(primerange(2, 100))  # adjust range as needed
products = [[]]
count = 0

for p in primes:
    new_prods = []
    for prod in products:
        candidate = prod + [p]
        if reduce(lambda x, y: x * y, candidate, 1) <= 100000:  # upper limit
            new_prods.append(candidate)
            if is_valid(reduce(lambda x, y: x * y, candidate, 1)):
                count += 1
    products += new_prods

print(count)
结论

虽然求解Euler的Totient值比自身小1的元素计数的问题看起来非常具体,但我们已经得到了它的一般解,因此,我们可以用任意大小的质数集选择任意数量的质数,然后用它们的乘积来计算解的数量。