こんにちは|こんばんは。カエルのアイコンで活動しております @kyamaz です。
はじめに
最近 のエントリでは「娯楽数学」というジャンルを取り上げており、名前のついた合成数1を数回に渡り紹介してきました。今回の本稿でも特徴的な数字遊びでもある『カプレカ数』について紹介します。また、カプレカ数を求めるHaskellプログラム(決して効率的ではないです)も紹介します。
カプレカ数
カプレカ数を定義する前に『カプレカ操作』という数字の計算を定義します。
- カプレカ操作
- 正の整数 $n$ に対して、次の減算で得られる整数 $K(n)$ を求める操作を『カプレカ操作』といいます。
「$n$ の各桁を大きい順に並べた数」-「$n$ の各桁を小さい順に並べた数」
例えば、
$n=175$ のときは、$K(175) = 751 - 157 = 594$
$n=3003$ のときは、$K(3003) = 3300 - 33 = 3267$
となります。
この操作を使ってカプレカ数は次のように定義されます。
- カプレカ数
- カプレカ操作で不変な数、つまり $K(n) = n$ を満たす正の整数 $n$
注:「カプレカ数」という言葉を別の意味で使うこともあります。2
この数の名称は、インドの数学者カプレカル(Kaprekar)に由来します。彼は大学院教育を受けていませんでしたが、学校の教師として働いて、広範囲にわたったレクリエーション数学の執筆を行い、カプレカ数のほかに「自己数(コロンビア数)」「ハーシャッド数」「デムロ数」なども定義しています。
カプレカ数は、3桁では $495$ のみ、4桁では $6174$ のみで、5桁のカプレカ数は存在しません。最初のリストは、オンライン整数列大辞典の数列 A099009 を参照してください。
カプレカ数を求めるプログラム
さて、カプレカ数を求めるプログラムをHaskellで実装してみましょう。
kaprekars = [x | x <- [0..], mod x 9 == 0, k x == x] where k n = big n - small n where big = read . reverse . sort . show :: Integer -> Integer; small n = read $ sort $ show n :: Integer
決して効率的ではありませんが、このプログラムをGHCiで実行してみると次のように出力されます。(オンライン整数列大辞典のリストと同じように出力されます)ちなみに、9の倍数であること(mod x 9 == 0
)は簡単に示せるためプログラムではチェックする数を減らすために条件として入れてあります。
ghci> kaprekars
[0,495,6174,549945,631764,63317664,97508421,554999445,864197532^CInterrupted.
無限リストを出力するプログラムですので適当なタイミングで Ctrl-C
で処理を中止しました。なお、 の環境ではかなりの時間を要しました。
おわりに
もう少し効率的にできないかとも思いますが、本稿では定義に比較的忠実にプログラムを書きました。もし良いアイディアがあれば試してみてください。
最後に、本稿を記載するために検証したHaskell環境を記しておきます。お手元の環境で検証する際に、動作が異なるときには参考になるかもしれません。
本稿の環境
本稿のために使用した環境は以下となります。
- macOS: Sonoma 14.6.1 (chip: Apple M1)
- GHCup: 0.1.30.0
- GHC: 9.6.6
ご一読いただきまして有り難うございます。
(●)(●) Happy Hacking!
/"" __""\