Essaytial Machine Learning

機械学習は随想だ

Project Euler 5

Problem 5 - Project Euler

問題

  N 以下の任意の正整数で割り切れる最小の正整数を  PE5(N) と置いて  PE5(20) を求める。

記号

[ 表記 ]:[ 返り型 ]:[ 説明 ]
 y // x:整数:切り捨て除算、 y / x を超えない最大の整数
 \lfloor x \rfloor:整数: x を超えない最大の整数、ガウス関数

解法

 正整数  m, n が全て異なる素数 p_1, \dots, p_k と非負整数列  a_1, \dots, a_k, b_1, \dots, b_k によって  m = p_1^{a_1}\dots p_k^{a_k}, n = p_1^{b_1}\dots p_k^{b_k} と書ける時、 n m で割り切れる必要十分条件は任意の  i = 1, \dots, k a_i \leq b_i が成り立つことである。

 よって、正整数  n N 以下の任意の正整数で割り切れるためには、 \Pi(N) N 以下の正整数の素因数に成り得る数の集合として、 p \in \Pi(N) に対して  \sigma ^ N_p N 以下の正整数を素因数分解して現れる最大の  p の指数とした時、 \tau_p \geq \sigma ^ N_p を用いて  n = \prod _ {p \in \Pi(N)}p^{\tau_p} と書ける必要がある。 \prod _ {p \in \Pi(N)}p^{\tau_p} は全ての  \tau_p について狭義単調増加なので、そのような最小の  n \prod_{p \in \Pi(N)}p^{\sigma ^ N_p} である。

  \Pi(N) については素数の集合なので一般的にあまり具体的には書き下せないが、 N 以下の全ての素数を含み、 N を超える全ての素数を含まないことから  N 以下の全ての素数の集合として与えられることは分かる。 \sigma ^ N_p については  p に対して具体的に得られ、

 \displaystyle p^{\lfloor\log_p(N)\rfloor} \leq N = p^{\log_p(N)} \lt p^{\lfloor\log_p(N)\rfloor+1}

から  \sigma ^ N_p = \lfloor\log_p(N)\rfloor となる。

 よって求める正整数は

 \displaystyle PE5(N) = \prod_{p \leq N: \text{素数}}p^{\lfloor\log_p(n)\rfloor}. //

  \Pi(20) = \{ 2, 3, 5, 7, 11, 13, 17, 19 \}

 \displaystyle \sigma^{20}_p = \begin{cases} 4 & p = 2, \\ 2 & p = 3, \\ 1 & \text{otherwise}, \end{cases}

より

 \displaystyle PE5(20) = 2^4 3^2 5^1 7^1 11^1 13^1 17^1 19^1 = 232792560.

近似手法

  N 以下の素数の個数と  m 番目の素数についてはそれぞれ近似式が知られているので、それで  PE5(N) の近似式も得られるが、(筆者が知る近似法では)小さい素数に関する近似値の誤差が大きく、それらの積を含む  PE5(N) の近似精度は符号が変わるレベルで悪い。