ハーシャッド数とズッカーマン数

こんにちは｜こんばんは。カエルのアイコンで活動しております @kyamaz :frog: です。


## はじめに
以前のエントリ『[カプレカ数](https://qiita.com/kyamaz/items/5f2697b5f0263201ecb9)』を紹介した際に、インドの数学者カプレカル（Kaprekar）がレクリエーション数学においてカプレカ数以外にも特徴のある数を定義していたことを紹介しました。その中に本稿で取り上げる『ハーシャッド数』という数があります。下記に定義しますが、ハーシャッド数は各桁を足し合わせる数がその約数にあるかを判定します。それに似た数として、各桁を掛け合わせる数がその約数にあるかを判定に使った『ズッカーマン数』という数があります。本稿では、この２つの数に着目して紹介します。

それぞれを紹介しつつ簡単なプログラムを紹介しますが、その前にどちらも各桁のリストが必要となるため、ある数 $n$ の各桁の配列を得る関数をHaskellプログラムで記述しておきましょう。

```haskell: 各桁の数字の配列を得る関数 digitRev
digitRev n | n == 0 = [] | otherwise = d : digitRev r where (r,d) = quotRem n 10
```


## ハーシャッド数（ニーベン数）
ハーシャッド数は、以下のWikipediaで紹介されております。

https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%83%E3%83%89%E6%95%B0

定義としては「ハーシャッド数とは自然数 $n$ の各位の数字和が元の数の約数に含まれている自然数 $n$」です。式で表すと以下のとおり。

:::note info
<dl><dt>ハーシャッド数とは</dt>
<dd>
$n \in \mathbb{N}$ を $b$ 進法で $m$ 桁の数とし、右端から $k$ 桁目の数字を $a_{k} (k = 1, 2, \dots, m)$ とすると $\displaystyle n = \sum_{k=1}^{m} a_{k} b^{k-1} $ と表される。

ハーシャッド数は、$\displaystyle  (\sum_{k=1}^{m} a_{k}) \Big| n$ となる数 $n$
</dd>
</dl>
:::

ハーシャッド数は、別名でカナダ系アメリカ人の数学者イヴァン・ニーベンにちなんで、ニーベン数（Niven number）とも呼ばれているそうです。また、オンライン整数列大辞典では [A005349](https://oeis.org/A005349) に最初の方のリストが掲載されております。

ハーシャッド数を出力するプログラムは次のように書けます。

```haskell:
ghci> harshad = [n | n<-[1..], let x = foldr (+) 0 (digitRev n), x /= 0, n `mod` x == 0]
ghci> take 100 harshad
[1,2,3,4,5,6,7,8,9,10,12,18,20,21,24,27,30,36,40,42,
45,48,50,54,60,63,70,72,80,81,84,90,100,102,108,110,111,112,114,117,
120,126,132,133,135,140,144,150,152,153,156,162,171,180,190,192,195,198,200,201,
204,207,209,210,216,220,222,224,225,228,230,234,240,243,247,252,261,264,266,270,
280,285,288,300,306,308,312,315,320,322,324,330,333,336,342,351,360,364,370,372]
```

## ズッカーマン数

ズッカーマン数は、以下のWikipediaで紹介されております。

https://ja.wikipedia.org/wiki/%E3%82%BA%E3%83%83%E3%82%AB%E3%83%BC%E3%83%9E%E3%83%B3%E6%95%B0


定義としては「ズッカーマン数とは自然数 $n$ の各位の数字積が元の数の約数に含まれている自然数 $n$」です。式で表すと以下のとおり。

:::note info
<dl><dt>ズッカーマン数とは</dt>
<dd>
$n \in \mathbb{N}$ を $b$ 進法で $m$ 桁の数とし、右端から $k$ 桁目の数字を $a_{k} (k = 1, 2, \dots, m)$ とすると $\displaystyle n = \sum_{k=1}^{m} a_{k} b^{k-1} $ と表される。

ズッカーマン数は、$\displaystyle  (\prod_{k=1}^{m} a_{k}) \Big| n$ となる数 $n$
</dd>
</dl>
:::

オンライン整数列大辞典では [A007602](https://oeis.org/A007602) に最初の方のリストが掲載されております。
ズッカーマン数を出力するプログラムは次のように書けます。

```haskell:
ghci> zuckerman = [n | n<-[1..], let x = foldr (*) 1 (digitRev n), x /= 0, n `mod` x == 0]
ghci> take 100 zuckerman
[1,2,3,4,5,6,7,8,9,11,12,15,24,36,111,112,115,128,132,135,
144,175,212,216,224,312,315,384,432,612,624,672,735,816,1111,1112,1113,1115,1116,1131,
1176,1184,1197,1212,1296,1311,1332,1344,1416,1575,1715,2112,2144,2232,2916,3111,3132,3168,3171,3276,
3312,3915,4112,4224,4416,6144,6624,6912,7112,7119,8112,8832,9315,9612,11111,11112,11115,11133,11172,11212,
11232,11313,11328,11331,11424,11664,11711,11872,12112,12128,12132,12216,12224,12288,12312,12432,12712,12768,13113,13131]
```

## おわりに
本稿でご紹介したもの以外にも、娯楽数学（または、レクリエーション数学）には色々な数（数列）の定義があるようです。このような数列の探求や新しい数の定義を見つけるのは、シチズンサイエンスとして良い題材ではないでしょうか。皆さまも深掘ってみると楽しいかもしれません。

最後に、本稿を記載するために検証したHaskell環境を記しておきます。お手元の環境で検証する際に、動作が異なるときには参考になるかもしれません。

<details><summary>本稿の環境</summary>

本稿のために使用した環境は以下となります。
macOS: Sonoma 14.6.1 (chip: Apple M1)
GHCup: 0.1.30.0
GHC: 9.6.6

</details>

ご一読いただきまして有り難うございます。
（●）（●） Happy Hacking!
/""　＿＿""＼