目次
数秘術を元にある年の運勢を占うプログラムを作りました。
パーソナルイヤーの計算方法
パーソナルイヤーは年月日のすべての桁の数を足して、1桁になるまで同じように足して得られる結果です。
たとえば の場合は 1 + 9 + 8 + 6 + 1 + 2 + 8 = 35 、 3 + 5 = 8 というように計算します。
パーソナルイヤーを計算するプログラム
年月日を上述のように足してもいいのですが、 ループを使って足し算のアルゴリズムを書くよりも、割ったほうが楽にできます。 1986年10月28日 の場合は、 1986 % 9 + 1 % 9 + 28 % 9
や 1986128 % 9
で計算できます。
仕組み
任意の正の整数について、すべての桁の数を足した数を求めます。 求められた数について同じ作業をします(すべての桁の数を足した数を求める)。 これを、1桁の数が得られるまで繰り返したときの値は、元の整数が9で割り切れる場合は9に等しく、そうでない場合は元の整数を9で割った余りに等しくなります。
そのため、上のように9で割ってもほしい答えが得られるようになっています。
証明
証明すべきことは次の3つです。
- 有限回の作業で1桁の正整数にできる
- 得られた1桁の正整数と元の数をそれぞれ9で割った余りは等しい
- 9で割った余りと足して得られた1桁の数は等しい(余りが 0 の場合は 9 が得られる)
すべての桁の数を足す作業を “作業\(P\)” と表すことにします。
任意の \( 0 \) 以上の \(n\) 桁整数 \( A \) を次のように表します。
\[ A = \sum _{k=0} ^{n} 10^k a_k \; (0 \leq a_k < 10, a_k \in \mathbb{N}) \](1) 2桁以上の正の整数のすべての桁を足すと、計算前の数字よりも小さくなる
操作\(P\)を行ったときに、大きな数ができると作業が永遠に終わりませんから、 操作を行うことで小さな数が得られることを確認します。
\( n \geq 2 \) のとき、
\[ A – \sum _{k=0} ^{n} a_k = \sum _{k=0} ^{n} (10^k – 1) a_k > 0 .\](2) 任意のn桁の正整数のすべての桁を足すと必ず正の数になる
操作\(P\)によって0以下の数ができると割り算が厄介です。 そうならないことを確認しておきます。
\(a_n > 0\) により、
\[ \sum _{k=0} ^{n} a_k \gt 0 .\]以上より、任意の正の整数は、作業\(P\)を有限回繰り返すことで1桁の整数にすることができます。
(3) 任意の0以上の整数を9で割った余りは、すべての桁の数を足して9で割った余りに等しい。
\[ A \equiv \sum _{k=0} ^{n} 1^k a_k \equiv \sum _{k=0} ^{n} a_k \ \left( \bmod 9 \right) \]となるので、\(A\) を \( 9 \) で割った余りは すべての桁の数を足して9で割った余りに等しくなります。
この法則は九去法でも使われています。 九去法は検算の方法
(3) を有限回適用することで、 任意の0以上の整数を9で割った余りが、作業\(P\)を繰り返してできた1桁の正整数を9で割った余りに等しいことがわかります。
1桁の数について、9で割った余りが 0, 1, 2, 3, 4, 5, 6, 7, 8 になる場合、 割られる1桁の数は 9, 1, 2, 3, 4, 5, 6, 7, 8 です((3)により0になることはない)。 よって、任意の正の整数について、作業\(P\)を、1桁の数が得られるまで繰り返したとき、その1桁の数は元の整数が9で割り切れる場合は9に等しく、そうでない場合は元の整数を9で割った余りに等しくなります。