---
# System prepended metadata

title: 今年の整数問題（2019/01/10）
tags: [' 整数問題', 数学]

---

---
tags: 数学, 整数問題
---
今年の整数問題（2019/01/10）
==================

## 問題

### 【問題1】

$\frac{n}{35530n+1}$ を十進小数表記したとき循環節の長さ（最小のもの）が $n$ となる最小の整数 $n(\ge 1)$ を求めよ。ただし今日(2019/01/10)は私の $n$ 歳の誕生日です。

### 【問題2】

問題1 の解を $n_0$ とおく。問題1 の題意を満たす $n > n_0$ について論じよ。もし存在すれば例を示せ、存在しないならそれを証明せよ。

## 解答

【問題1】
$n = 43$

【問題2】
例えば $n = 374011, 10061599$ 等は題意を満たす。

### 解説

#### 定義・前提条件等

有理数（$0<r<1$）を（十進）小数展開したときに循環小数となり、ある数字列 $a_i, b_j\ (0 \le a_i, b_j \le 9)$ を用いて「$0.a_1a_2\dots a_l\ b_1b_2\dots b_k\ b_1b_2\dots b_k\ \dots$」のように書けるとする。
**循環節** とはこの「$b_1b_2\dots b_k$」の部分を指す言葉とする、すなわち数字列の繰り返し単位を指す言葉とする。
例えば $\frac{4}{33} = 0.12121212\dots$ の場合は 「$12$」も「$1212$」も「$12121212$」も循環節であるが、そのうち長さが最小のもの（この場合「$12$」）を **基本循環節** と呼ぶ。
これ以降、特に断りがない限り、基本循環節の意味で『循環節』という言葉を用い、「基本循環節の長さ（＝循環節の長さのうち最小のもの）」のことを指して『**循環節の長さ**』という言葉を用いる。

なおこの記事の数学的背景は、主に 参考文献1[^1] に依っている。

#### 【問題1】

まず、以下の2つの命題を考える：

:::info
### ==命題1.==

$m > 1$ を $\gcd(m, 10) = 1$ とし、$\frac{1}{m}$ の循環節の長さを $k$ とおく。この時、$10^k \equiv 1 \ ({\rm mod}\ m)$ である。
:::

> 註：この命題における循環節（の長さ）は基本循環節（の長さ）に限らず、一般に成立する。
> 
> 証明：
> 
> 一般に、小数点以下の循環節の前までを $l$ 桁とすると、ある整数 $a\ (0 \le a < 10^l), b\ (1 \le b < 10^k)$ が存在して以下が成り立つ：
> 
> $$
\begin{eqnarray*}
\frac{1}{m} &=& \frac{a}{10^l} + \frac{b}{10^{k+l}} + \frac{b}{10^{2k+l}} + \dots \\
&=& \frac{a}{10^l} + \frac{b}{10^l} \cdot \frac{\frac{1}{10^k}}{1 - \frac{1}{10^k}}\\
&=& \frac{a}{10^l} + \frac{b}{10^l} \cdot \frac{1}{10^k - 1}\\
&=& \frac{a(10^k-1) + b}{10^l(10^k - 1)}
\end{eqnarray*}
$$
> 
> 特に $m \mid 10^l(10^k-1)$ である。
> ここで $\gcd(m, 10) = 1$ より、$m \mid 10^k-1$、すなわち $10^k \equiv 1 \ ({\rm mod}\ m)$ である。 
> 
> （証明終わり）
> 
> 補足：この時、実際には $l=0$、$a=0$ すなわち $\frac{1}{m} = \frac{b}{10^k-1}$ となる（参考文献1[^1] の定理1・定理2 参照） 。

[^1]: 参考文献1：[循環小数についての種々の考察](http://www2r.biglobe.ne.jp/kosanhp/math/junkan.pdf)（2008年 5月　奥村 清志）

:::info
### ==命題2.==

$m > n > 1$ を $\gcd(m, 10) = 1, \gcd(m, n) = 1$ とし、$\frac{1}{m}$ の循環節の長さを $k$ とおく。この時、$\frac{n}{m}$ の循環節の長さも $k$ である。
:::

> 証明：略（参考文献1[^1] の「3 シフト系とその性質 (その 1)」以降を参照）

$n \in \mathbb{Z}_{>0}$ に対して $\gcd(35530n + 1, 10) = 1$ かつ $\gcd(35530n + 1, n) = 1$ なので、==命題1.== と ==命題2.== より、$\frac{n}{35530n + 1}$ の循環節の長さが $n$ となるかどうかは、$35530n + 1$ で $10^n$ を割った余りが $1$ になるかどうか（かつ、任意の整数 $n^\prime$（$1 \le n^\prime < n$）について $35530n + 1$ で $10^{n^\prime}$ を割った余りが $1$ とならないかどうか）を見れば良い。

簡単なプログラムを書くことによって、そのような $n$ の最小値が $n_0 = 43$ であることは容易に確かめられる。以下はそのようなプログラム例（言語：[Julia](https://julialang.org)）である。`powermod(b, k, m)` は「$b^k$ を $m$ で割った余り（累乗剰余）」を計算する関数である。答えは一瞬で返ってくる

```julia
function solve1()
    for n = 2:100
        den = 35530n + 1
        if powermod(10, n, den) == 1
            all(powermod(10, k, den) != 1 for k=2:n-1 if n%k==0) && return n
        end
    end
end

```

#### 【問題2】

問題1の解答 $n_0 = 43$ について考えると、それ自身も $35530n_0+1 = 1527791$ も素数であることが分かる。  
実際、$\frac{1}{an+1}$ の循環節の長さが $n$ となるなら、$n$ も $an+1$ も素数であることが多い。

> ∵ $\phi(n)$ をオイラーの関数（$n \in \mathbb{Z}_{>0}$ に対して $n$ と互いに素な整数 $k (1 \le k < n)$ の個数を返す関数）とすると、$\frac{1}{n}$ の循環節の長さは $\phi(n)$ の約数であることが知られている。
> 素数 $p$ に対しては $\phi(p)=p-1$ なので、$an+1$ が素数なら $\phi(an+1) = an$ である。よって $\frac{1}{an+1}$ の循環節の長さは $an$ の約数と言うことになり、$n$ となる可能性が高くなる。
> また $n$ が素数ならば、任意の $k\ (1 < k < n)$ に対して $10^k-1$ は $10^n-1$ の約数にならない（k が n の約数になり得ないので）。これは $\frac{1}{an+1}$ の循環節の長さ（の候補）が $n$ であると分かった場合に、その約数（$<n$）となる可能性がないことを意味する。よって $an+1$ が $10^n-1$ を割り切るかどうかだけを確認すれば良い。

よって $43$ より大きな素数 $p$ を考えて、$35530p+1$ も素数となるものについてそれが $10^p-1$ を割り切るかどうかを確認する、と言う方法で比較的効率的に候補を探すことが出来る。

この方法で求解するプログラム例を示す（言語：Julia、要 [Primes.jl](https://github.com/JuliaMath/Primes.jl)）：

```julia
using Primes

function find_answer_over_43()
    lo = 43
    hi = 35530
    while true
        for p in primes(lo + 1, hi)
            den = 35530p + 1
            if isprime(den)
                if powermod(10, p, den) == 1
                    @debug "Found!" p
                    return p
                else
                    @debug "NG" p
                end
            else
                @debug "Pass…" p
            end
        end
        lo = hi
        hi += 30000
    end
end
```

（`@debug` はデバッグログ出力のためのマクロで、通常は何も出力されない。`ENV["JULIA_DEBUG"] = "all"` 等の設定がしてあれば然るべき出力先（デフォルトでは標準エラー出力）にデバッグ情報が出力される）

これを実行することで、数秒程度で $n = 10061599$ が見つかる。$35530 \times 10061599 + 1 = 357488612471$ であり、$\frac{1}{357488612471}$ の循環節の長さは $10061599$ となる（確認は読者への宿題とするw）。

これが題意を満たす整数のうち $43$ の次に小さい数かというと、これよりも小さいものが存在することも容易に確認できる。

```julia
using Primes

function generate_answers(;lo=2, hi=200000000000000)
    Channel(ctype=Int, csize=1) do channel::Channel{Int}
        for n::Int = lo:hi
            den = 35530n + 1
            if powermod(10, n, den) == 1
                if isprime(n)
                    put!(channel, n)
                elseif all(powermod(10, k, den) != 1 for k=2:n-1 if n%k==0)
                    put!(channel, n)
                else
                    @debug "NG" n
                end
                yield()
            end
        end
    end
end
```

（`Channel` は Julia の`Task`（コルーチン）間でデータをやり取りできるオブジェクト（go言語の `channel` に相当））

このプログラムは $n \ (2 \le n \le 200000000000000)$ に対して題意を満たすものを全て列挙するものである（`Int == Int64` を仮定している）。関数の戻り値は `Channel{Int}` であり、これを `for` 文に渡したり `Iterators.take()` を利用することで最初の数件を取り出したり出来る。例えば以下のようにすると、数十秒程度で $43$〜$10061599$ までの最初の21件を列挙する。

```julia
for (i,n) in enumerate(generate_answers())
     println("$i: $n")
     n >= 10061599 && break
end
# => 1: 43
#    2: 374011
#    3: 383880
#    4: 430387
#    5: 498279
#    6: 874252
#    7: 991020
#    8: 1898659
#    9: 2233080
#    10: 3166507
#    11: 4455471
#    12: 5371759
#    13: 5774791
#    14: 6229056
#    15: 7008067
#    16: 7743076
#    17: 7787292
#    18: 8442591
#    19: 8505576
#    20: 9864931
#    21: 10061599
```

これにより、題意を満たす $43$ の次に小さいものは $n_1 = 374011$ であることが分かる。それ自身は素数ではない（$374011 = 11^3 \cdot 281$）が、$35530n_1 + 1 = 13288610831$ は素数である。

なお今のところ、$1 \le n \le 4294967295$（$4294967295 = 2^{32}-1$ は32bit符号なし整数の最大値）までの題意を満たす $n$ で、$35530n+1$ が素数でないものは見つかっていない。

（終わり）