カプレカ数と6174のブラックホール
並び替えて引き算を繰り返すと、どんな数も必ず「6174」に吸い込まれる数の神秘
- 1
- 4桁の数字(すべての桁が同じでないもの)の各桁を大きい順に並べた数から小さい順に並べた数を引く操作を「カプレカ操作」と呼ぶ。
- 2
- どんな数から始めても、最大7回以内の操作で必ず「6174」に到達し、以降は 7641 - 1467 = 6174 と自己保存ループに入る。
- 3
- 3桁の整数の場合は「495」が同様のカプレカ定数となる。
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
1949年にインドの数学者D.R.カプレカが発見した、数の桁の並び替え演算における極めて特異な不動点(Fixed Point)です。学校では習いませんが、「数の周期性と力学系の収束」という高度な数学のエッセンスが小学生レベルの四則演算だけで体験できます。
身につく武器・思考力
四則演算に対する直感力と、動的システムが一定の安定解(アトラクター)へ収束していく力学系・アルゴリズムの基礎感覚が身につきます。
実社会・ITでの活躍現場
- •カオス理論や複雑系におけるアトラクター(引き込み領域)の解析
- •ハッシュ関数や疑似乱数生成器の周期性・不動点検証
- •プログラミングの再帰・反復アルゴリズムと収束判定のテストケース
Layer 1 — 直感・シミュレーター
お好きな4桁(または3桁)の数字を入力するか、「ランダム生成」を押してください。最大値と最小値の引き算を繰り返すたびに、驚くべき速さで「6174」へ吸い込まれる様子を体験できます。
数字の並び替えと引き算だけで、必ず「6174」に吸い込まれる
3桁のカプレカ定数「495」について、カプレカ操作(最大並び替え - 最小並び替え)を行うと計算式はどうなるでしょうか?
Layer 2 — 定義・受験・証明
定義
与えられた 桁の正の整数 に対し、各桁の数字を降順に並べた数を 、昇順に並べた数を とするとき、写像 を**カプレカ変換**と呼びます。変換の不動点 を満たす数を**カプレカ定数**と呼びます。
公式・数理モデル
証明・導出
4桁の数を と並べたとき、最大値は 、最小値は です。その差は となり、必ず 9 の倍数かつ有限の組み合わせ(差の組 は高々数十通り)に縮退します。この有向グラフを追跡すると、全孤立点を含め最大7ステップですべて「6174」の単一サイクルに吸収されることが全数探索により数学的に証明されています。
押さえておきたいポイント
- 4桁のカプレカ定数は 6174(最大7ステップで収束)
- 3桁のカプレカ定数は 495(最大6ステップで収束)
- 全桁同数(1111など)は 0 になるため除外される
- 非線形力学系における「アトラクター(安定引き込み点)」の離散数値モデル
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
数値シミュレーションと収束不動点探索アルゴリズム
任意の整数に対してカプレカ操作を反復し、収束ステップ数と軌跡配列を計算するTypeScript実装です。力学系のサイクル検出やハッシュ衝突探索の基礎ロジックに応用されます。
1export interface KaprekarStep {2 step: number;3 current: number;4 desc: number;5 asc: number;6 diff: number;7}89export function computeKaprekarRoutine(num: number, digits: 3 | 4 = 4): KaprekarStep[] {10 const target = digits === 4 ? 6174 : 495;11 const history: KaprekarStep[] = [];12 let current = num;1314 for (let step = 1; step <= 10; step++) {15 const s = current.toString().padStart(digits, "0");16 const descStr = s.split("").sort((a, b) => b.localeCompare(a)).join("");17 const ascStr = s.split("").sort((a, b) => a.localeCompare(b)).join("");1819 const desc = parseInt(descStr, 10);20 const asc = parseInt(ascStr, 10);21 const diff = desc - asc;2223 history.push({ step, current, desc, asc, diff });2425 if (diff === target || diff === current) {26 break;27 }28 current = diff;29 }3031 return history;32}3334// 実行例:35// const trace = computeKaprekarRoutine(2026, 4);36// console.log("収束までの軌跡:", trace);
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元