オイラーのφ関数¶
オイラーのφ関数 $\varphi(n)$ は、$\{1,\ldots,n\}$ のうち $n$ と 互いに素な整数の個数を表します。$n$ の相異なる素因数を $p_1,\ldots,p_k$ とすると、
$$ \varphi(n) =n\prod_{j=1}^k\left(1-\frac1{p_j}\right). $$
この積公式から、素因数分解を使うのが自然な計算方法だと分かります。
型付きの直接的な定義¶
素因数分解には同じ素数が繰り返し現れることがあるため、積を取る前に unique で重複を取り除きます。最終結果は整数ですが、途中の各因子も厳密に 扱えるよう、有理数演算を用います。
def φ (n : Integer) : Rational :=
n * product (map (\p -> 1 - 1 / p) (unique (pF n)))
(pF 36, unique (pF 36), φ 36)
最初の20個の値¶
各 $n$ についてφ関数の値と完全な素因数分解を並べて表示すると、素数や 素数の冪における値の変化を比較しやすくなります。
map (\n -> (n, φ n, pF n)) (take 20 nats)
約数和に関する恒等式¶
すべての正の整数について、次の恒等式が成り立ちます。
$$ \sum_{d\mid n}\varphi(d)=n. $$
約数であるという条件は通常のフィルターで表現でき、先ほどと同じ例を使って この恒等式を検証できます。
def divisorsOf (n : Integer) : [Integer] :=
filter (\d -> divisor n d) [1..n]
def totientDivisorSum (n : Integer) : Rational :=
sum (map φ (divisorsOf n))
(divisorsOf 36, totientDivisorSum 36)
まとめ¶
素因数分解、重複除去、写像、積を直接組み合わせることで、オイラーの積公式を 厳密な一行の定義として表せます。約数和の検算からは、同じ関数がより深い 数論的恒等式にも現れることが分かります。