【数学溢れ話】【Token】どうして掛け算の九九には36個の数字しか使われないのか？

**数理モデル**(<font color="blue">Mathematical model</font>)の世界では、しばしば単純な問いに応える為に複雑な演算を重ねる必要が生じます。
[【初心者向け】Rからxtableを用いて掛け算九九表のHTMLを出力する。](https://qiita.com/ochimusha01/items/32fc987f5b4f1aa53fc4)

<!-- html table generated in R 3.5.2 by xtable 1.8-4 package -->
<!-- Fri Mar 13 06:09:42 2020 -->
<table border=1>
<tr> <th>  </th> <th> 1x </th> <th> 2x </th> <th> 3x </th> <th> 4x </th> <th> 5x </th> <th> 6x </th> <th> 7x </th> <th> 8x </th> <th> 9x </th>  </tr>
  <tr> <td align="right"> 1y </td> <td align="right">   1 </td> <td align="right">   2 </td> <td align="right">   3 </td> <td align="right">   4 </td> <td align="right">   5 </td> <td align="right">   6 </td> <td align="right">   7 </td> <td align="right">   8 </td> <td align="right">   9 </td> </tr>
  <tr> <td align="right"> 2y </td> <td align="right">   2 </td> <td align="right">   4 </td> <td align="right">   6 </td> <td align="right">   8 </td> <td align="right">  10 </td> <td align="right">  12 </td> <td align="right">  14 </td> <td align="right">  16 </td> <td align="right">  18 </td> </tr>
  <tr> <td align="right"> 3y </td> <td align="right">   3 </td> <td align="right">   6 </td> <td align="right">   9 </td> <td align="right">  12 </td> <td align="right">  15 </td> <td align="right">  18 </td> <td align="right">  21 </td> <td align="right">  24 </td> <td align="right">  27 </td> </tr>
  <tr> <td align="right"> 4y </td> <td align="right">   4 </td> <td align="right">   8 </td> <td align="right">  12 </td> <td align="right">  16 </td> <td align="right">  20 </td> <td align="right">  24 </td> <td align="right">  28 </td> <td align="right">  32 </td> <td align="right">  36 </td> </tr>
  <tr> <td align="right"> 5y </td> <td align="right">   5 </td> <td align="right">  10 </td> <td align="right">  15 </td> <td align="right">  20 </td> <td align="right">  25 </td> <td align="right">  30 </td> <td align="right">  35 </td> <td align="right">  40 </td> <td align="right">  45 </td> </tr>
  <tr> <td align="right"> 6y </td> <td align="right">   6 </td> <td align="right">  12 </td> <td align="right">  18 </td> <td align="right">  24 </td> <td align="right">  30 </td> <td align="right">  36 </td> <td align="right">  42 </td> <td align="right">  48 </td> <td align="right">  54 </td> </tr>
  <tr> <td align="right"> 7y </td> <td align="right">   7 </td> <td align="right">  14 </td> <td align="right">  21 </td> <td align="right">  28 </td> <td align="right">  35 </td> <td align="right">  42 </td> <td align="right">  49 </td> <td align="right">  56 </td> <td align="right">  63 </td> </tr>
  <tr> <td align="right"> 8y </td> <td align="right">   8 </td> <td align="right">  16 </td> <td align="right">  24 </td> <td align="right">  32 </td> <td align="right">  40 </td> <td align="right">  48 </td> <td align="right">  56 </td> <td align="right">  64 </td> <td align="right">  72 </td> </tr>
  <tr> <td align="right"> 9y </td> <td align="right">   9 </td> <td align="right">  18 </td> <td align="right">  27 </td> <td align="right">  36 </td> <td align="right">  45 </td> <td align="right">  54 </td> <td align="right">  63 </td> <td align="right">  72 </td> <td align="right">  81 </td> </tr>
   </table>

有名な例の一つが「**どうして掛け算の九九には36個の数字しか登場しないのか**」なる小学生でも邂逅する疑問で、その答えを得るには**素因数分解** (<font color="blue">Prime Factorization</font>)の世界に足を踏み入れないといけません。
[まさかのNP困難？「九九って36種類しか数がないの不思議だよな」から始まる数学談義](https://togetter.com/li/1098244)

#エラトステネスの篩（<font color="blue">ふるい,Sieve of Eratosthenes</font>）による合成数（<font color="blue">Composite Number</font>）の振るい落とし。

まずは基本中の基本。「**素数**（<font color="blue">Prime Number</font>）**とは何か**」について以下の定義を借用します。
[The Murderous Maths Sieve of Eratosthenes](http://www.murderousmaths.co.uk/books/MMoE/erat.htm)
![20190614140421.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/7c1d8884-375f-c39b-2eae-cbc38636ba81.gif)
[吉田武「**オイラーの贈物**」「**基礎理論**(<font color="blue">Basic Theory</font>)」「**素数**（<font color="blue">Prime Number</font>）と**合成数**（<font color="blue">Composite Number</font>）」より](https://www.amazon.co.jp/%E6%96%B0%E8%A3%85%E7%89%88-%E3%82%AA%E3%82%A4%E3%83%A9%E3%83%BC%E3%81%AE%E8%B4%88%E7%89%A9%E3%83%BC%E4%BA%BA%E9%A1%9E%E3%81%AE%E8%87%B3%E5%AE%9De-i%CF%80-%E2%88%921%E3%82%92%E5%AD%A6%E3%81%B6-%E5%90%89%E7%94%B0/dp/448601863X)

1. 自然数において<font color="green">1</font>と<font color="green">その数自身</font>(<font color="blue">The Number Itself</font>)の他に**約数**（<font color="blue">Divisor</font>）を持たない数を**素数**（<font color="blue">Prime Number</font>）という。そしてそれ以外の、すなわちいずれかの素数の積、すなわち**倍数**（<font color="blue">Multiple</font>）として表現可能な、すなわち**素因数分解**（<font color="blue">Prime Factorization</font>）可能な数を**合成数**（<font color="blue">Composite Number</font>）という。
2. 自然数<font color="green">2</font>は唯一の偶数の素数であり、**偶素数**（<font color="blue">Even Prime Number</font>）とも呼ばれる。
3. 素因数分解は掛ける順番を考慮しないでよければ一意に定まる。これを素因数分解の**一意性**（<font color="blue">Uniqueness</font>）という。
4. 具体的な素数の求め方としては**エラトステネスの篩**（<font color="blue">ふるい,Sieve of Eratosthenes</font>）が素数を組織的に求める方法として現在なおも意味を保ち続けている。

**エラトステネスの篩**（<font color="blue">ふるい,Sieve of Eratosthenes</font>）

1. まずは最小の素数<font color="green">2</font>で割り切れる数、すなわち<font color="green">2</font>の**倍数**（<font color="blue">Multiple</font>）あるいは**偶数**（<font color="blue">Even Numbers</font>）を除去する。かくして<font color="green">1</font>を除く**奇数**(<font color="blue">Odd Numbers</font>)だけが残る。
2. 残った数の先頭である<font color="green">3</font>の倍数<font color="green">6,9,12…</font>を除去する。
3. これを**ガウスの記号**（<font color="blue">Gaus's symbol</font>）すなわち<font color="green">Nを超えない最大の整数[N]の平方根</font>、すなわち<font color="green">[sqrt(N)]</font>まで繰り返す。

```R
#上掲の定義に従って１を除いた奇数の自然数（上限100）から検討を開始する。
Evaluation_Target<-c(3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45, 47,49,51,53,55,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,87,89,91,93,95,97,99)
#この単元は100を最大数とするので[sqrt(100)]すなわち検討対象が10を超えたら検討を終了する。
Evaluation_Max<-c(10)
#開始時点で素数リストは2のみ
Prime_Number_List<-c(2)
#具体的検討過程①検討対象の先頭の数字を取り出す。まずは３が出てくる。
Current_Prime_Number<-Evaluation_Target[1]
Current_Prime_Number
[1] 3
#②取り出した数字が検討の上限を超えてたら検討終了。そうでなければ、取り出した数字を素数リストに追加してその倍数を検討対象リストから除去する。まずは上限以下のケースから開始。
Current_Prime_Number_List <-c(Prime_Number_List,Current_Prime_Number)
Current_Prime_Number_List
[1] 2 3
Natural_Number_Coefficient<-c(1:100)
Current_Multiple_Sequence<-Natural_Number_Coefficient*Current_Prime_Number
Current_Multiple_Sequence
[1] 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66
[23] 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132
[45] 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198
[67] 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264
[89] 267 270 273 276 279 282 285 288 291 294 297 300
Current_Evaluation_list <- setdiff(Evaluation_Target, Current_Multiple_Sequence)
Current_Evaluation_list
[1] 5 7 11 13 17 19 23 25 29 31 35 37 41 43 47 49 53 55 59 61 65 67 71 73 77 79 83 85 89 91
[31] 95 97

#③次の検討対象の先頭の数字を取り出す。５が出てくる。
Current_Prime_Number<-Current_Evaluation_list[1]
Current_Prime_Number
[1] 5
#④繰り返す。
Current_Prime_Number_List <-c(Prime_Number_List,Current_Prime_Number)
Current_Prime_Number_List
[1] 2 3 5
Current_Multiple_Sequence<-Natural_Number_Coefficient*Current_Prime_Number
Current_Evaluation_list <- setdiff(Current_Evaluation_list, Current_Multiple_Sequence)
Current_Evaluation_list
[1] 7 11 13 17 19 23 29 31 37 41 43 47 49 53 59 61 67 71 73 77 79 83 89 91 97
#⑤次の検討対象の先頭の数字を取り出す。７が出てくるので繰り返す。
Current_Prime_Number<-Current_Evaluation_list[1]
Current_Prime_Number
[1] 7
Current_Prime_Number_List <-c(Prime_Number_List,Current_Prime_Number)
Current_Prime_Number_List
[1] 2 3 5 7
Current_Multiple_Sequence<-Natural_Number_Coefficient*Current_Prime_Number
Current_Evaluation_list <- setdiff(Current_Evaluation_list, Current_Multiple_Sequence)
Current_Evaluation_list
[1] 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
#⑥次の検討対象の先頭の数字を取り出す。11が出てくる。検討の上限を超えたので検討中の素数リストに残りを加えて処理終了。

Prime_Number_List<-c(Current_Prime_Number_List,Current_Evaluation_list)
Prime_Number_List
[1] 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
```
上掲プロセスの関数化

```R
Prime_Number_Choosing<-function(Calculation_Max){
#「検討の上限」を準備する。
Evaluation_Max<-sqrt(Calculation_Max)

#「１を除く奇数の数列」を準備する。
Allmost_Natural_number_list<-c(1:Calculation_Max) #1を除く
Odd_General_Term<-function(x){2*x+1}
Allmost_Odd_Sequence<-Odd_General_Term(Allmost_Natural_number_list)
Evaluation_Target<-Allmost_Odd_Sequence[Allmost_Odd_Sequence <= Calculation_max]

#「最初の素数2のみが入った検討済み素数の数列」を準備する。
Prime_Number_List <-c("2")
#上掲処理を整理した抽出過程。
while(Evaluation_Target[1] <= Evaluation_Max){
Prime_Number_List <-c(Prime_Number_List,Evaluation_Target[1])
Current_Multiple_Sequence<-Allmost_Natural_number_list*Evaluation_Target[1]
Evaluation_Target <- setdiff(Evaluation_Target, Current_Multiple_Sequence)
}
Prime_Number_List<-c(Prime_Number_List,Evaluation_Target)
return(c(Prime_Number_List))
}
Prime_Number_Choosing(100)#25個
[1] "2" "3" "5" "7" "11" "13" "17" "19" "23" "29" "31" "37" "41" "43" "47" "53" "59" "61"
[19] "67" "71" "73" "79" "83" "89" "97"
#次の素数101はCalculation_Maxを10201以上に上げないと登場しない。しかも何故か計算エラーが…
Prime_Number_Choosing(10300)
while (Evaluation_Target[1] <= Evaluation_Max) { でエラー:
TRUE/FALSE が必要なところが欠損値です
```

#オイラーのφ関数(<font color="blue">Euler's Totient Function</font>)

実際の素数の求め方はこんな感じですが「**ある数までに含まれる互いに素な数字の数**」なら別の計算でもっと簡単に求められます。それが**オイラーのφ関数**(<font color="blue">Euler's Totient Function</font>)なんですね。
[オイラーのφ関数 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%A4%E3%83%A9%E3%83%BC%E3%81%AE%CF%86%E9%96%A2%E6%95%B0)
![20191220065606.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/47f1369e-dc86-b9e5-7d1b-5df72acc26ef.png)

[Python で素因数分解 ---　R の勝ちかな？](https://blog.goo.ne.jp/r-de-r/e/844a3f342dd057d6ce5782e301870631)

```R
install.packages("gmp")
install.packages("gmp")Installing package into ‘C:/Users/81806/Documents/R/win-library/3.5’(as ‘lib’ is unspecified)trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.5/gmp_0.5-13.5.zip'Content type 'application/zip' length 1110866 bytes (1.1 MB)downloaded 1.1 MB
package ‘gmp’ successfully unpacked and MD5 sums checked
The downloaded binary packages are in C:\Users\81806\AppData\Local\Temp\RtmpyQC7uP\downloaded_packages> library(gmp)
 次のパッケージを付け加えます: ‘gmp’ 
 以下のオブジェクトは ‘package:base’ からマスクされています: 
     %*%, apply, crossprod, matrix, tcrossprod 
Warning message: パッケージ ‘gmp’ はバージョン 3.5.3 の R の下で造られました
factorize(120)
Big Integer ('bigz') object of length 5:
[1] 2 2 2 3 5
```
実際のgmpライブラリ動作例

```R
factorize(12)
Big Integer ('bigz') object of length 3:
[1] 2 2 3
12*(1-1/2)*(1-1/3)
[1] 4
#実際に全列挙すれば，1,5,7,11 の 4個

factorize(90)
Big Integer ('bigz') object of length 4:
[1] 2 3 3 5
90*(1-1/2)*(1-1/3)*(1-1/5)
[1] 24

#実際に全列挙すれば，2、3、5、7、11、13、17、19、23、29、31、37、41、43、47、53、59、61、67、71、73、79、83、89の24個
```

それでは1桁の自然数同士の掛け合わせが2桁以内に収まってるケース、すなわち掛け算の九九で使われている数字について当て嵌めていきましょう。

###<font color="green">2^n</font>集(<font color="blue">Set</font>)
<font color="green">2,4,8,16,32,64</font>の<font color="green">6</font>個

```R
factorize(2)
Big Integer ('bigz') :
[1] 2

2*(1-1/2)
[1] 2
factorize(4)
Big Integer ('bigz') object of length 2:
[1] 2 2
4*(1-1/2)
[1] 2

factorize(8)
Big Integer ('bigz') object of length 3:
[1] 2 2 2

8*(1-1/2)
[1] 4

factorize(16)
Big Integer ('bigz') object of length 4:
[1] 2 2 2 2
16*(1-1/2)
[1] 8

factorize(32)
Big Integer ('bigz') object of length 5:
[1] 2 2 2 2 2
32*(1-1/2)
[1] 16

factorize(64)
Big Integer ('bigz') object of length 6:
[1] 2 2 2 2 2 2
64*(1-1/2)
[1] 32
```

###<font color="green">3^n</font>集(<font color="blue">set</font>)
<font color="green">3,9,27,81</font>の<font color="green">4</font>個

```R
factorize(3)
Big Integer ('bigz') :
[1] 3
3*(1-1/3)
[1] 2

factorize(9)
Big Integer ('bigz') object of length 2:
[1] 3 3

9*(1-1/3)
[1] 6

factorize(27)
Big Integer ('bigz') object of length 3:
[1] 3 3 3
27*(1-1/3)
[1] 18

factorize(81)
Big Integer ('bigz') object of length 4:
[1] 3 3 3 3
81*(1-1/3)
[1] 54
```

###<font color="green">5^n</font>集(<font color="blue">Set</font>)
<font color="green">5,25</font>の<font color="green">2</font>個

```R
factorize(5)
Big Integer ('bigz') :
[1] 5
5*(1-1/5)
[1] 4

factorize(25)
Big Integer ('bigz') object of length 2:
[1] 5 5
25*(1-1/5)
[1] 20 
```

###<font color="green">2^m*3^n</font>集(<font color="blue">Set</font>)
<font color="green">6,12,18,24,36,48,54,72,96</font>の<font color="green">9</font>個だが<font color="green">96</font>がレンジ外（<font color="blue">2*2*2*2*2*3が1桁の計算に収まらない</font>）。

```R
factorize(6)
Big Integer ('bigz') object of length 2:
[1] 2 3
6*(1-1/2)*(1-1/3)
[1] 2

factorize(12)
Big Integer ('bigz') object of length 3:
[1] 2 2 3
12*(1-1/2)*(1-1/3)
[1] 4

factorize(18)
Big Integer ('bigz') object of length 3:
[1] 2 3 3
18*(1-1/2)*(1-1/3)
[1] 6

factorize(24)
Big Integer ('bigz') object of length 4:
[1] 2 2 2 3
24*(1-1/2)*(1-1/3)
[1] 8

factorize(36)
Big Integer ('bigz') object of length 4:
[1] 2 2 3 3
36*(1-1/2)*(1-1/3)
[1] 12

factorize(48)
Big Integer ('bigz') object of length 5:
[1] 2 2 2 2 3
48*(1-1/2)*(1-1/3)
[1] 16

factorize(54)
Big Integer ('bigz') object of length 4:
[1] 2 3 3 3
54*(1-1/2)*(1-1/3)
[1] 18

factorize(72)
Big Integer ('bigz') object of length 5:
[1] 2 2 2 3 3
72*(1-1/2)*(1-1/3)
[1] 24

factorize(96)
Big Integer ('bigz') object of length 6:
[1] 2 2 2 2 2 3
96*(1-1/2)*(1-1/3)
[1] 32
```

###<font color="green">7^n</font>集(<font color="blue">Set</font>)
<font color="green">7,49</font>の<font color="green">2</font>個

```R
factorize(7)
Big Integer ('bigz') :
[1] 7
7*(1-1/7)
[1] 6

factorize(49)
Big Integer ('bigz') object of length 2:
[1] 7 7
49*(1-1/7)
[1] 42
```

###<font color="green">2^m*5^n</font>集(<font color="blue">Set</font>)
<font color="green">10,20,40,50,80</font>の<font color="green">5</font>個だが<font color="green">20,80</font>がレンジ外（<font color="blue">2*2*5と2*2*2*2*5が1桁の計算に収まらない</font>）

```R
factorize(10)
Big Integer ('bigz') object of length 2:
[1] 2 5
10*(1-1/2)*(1-1/5)
[1] 4

factorize(20)
Big Integer ('bigz') object of length 3:
[1] 2 2 5
20*(1-1/2)*(1-1/5)
[1] 8

factorize(40)
Big Integer ('bigz') object of length 4:
[1] 2 2 2 5
40*(1-1/2)*(1-1/5)
[1] 16

factorize(50)
Big Integer ('bigz') object of length 3:
[1] 2 5 5
50*(1-1/2)*(1-1/5)
[1] 20

factorize(80)
Big Integer ('bigz') object of length 5:
[1] 2 2 2 2 5
80*(1-1/2)*(1-1/5)
[1] 32
```

###<font color="green">2^m*7^n</font>集(<font color="blue">Set</font>)
<font color="green">14,28,56,98</font>の<font color="green">4</font>個だが<font color="green">98</font>がレンジ外（<font color="blue">2*2*2*2*7が1桁の計算に収まらない</font>）

```R
factorize(14)
Big Integer ('bigz') object of length 2:
[1] 2 7
14*(1-1/2)*(1-1/7)
[1] 6

factorize(28)
Big Integer ('bigz') object of length 3:
[1] 2 2 7
28*(1-1/2)*(1-1/7)
[1] 12

factorize(56)
Big Integer ('bigz') object of length 4:
[1] 2 2 2 7
56*(1-1/2)*(1-1/7)
[1] 24

factorize(98)
Big Integer ('bigz') object of length 3:
[1] 2 7 7
98*(1-1/2)*(1-1/7)
[1] 42
```

###<font color="green">3^m*5^n</font>集(<font color="blue">Set</font>)

<font color="green">15,45,75</font>の<font color="green">3</font>個だが<font color="green">75</font>がレンジ外（<font color="blue">3*5*5が1桁の計算に収まらない</font>）

```R
factorize(15)
Big Integer ('bigz') object of length 2:
[1] 3 5
15*(1-1/3)*(1-1/5)
[1] 8

factorize(45)
Big Integer ('bigz') object of length 3:
[1] 3 3 5
45*(1-1/3)*(1-1/5)
[1] 24

factorize(75)
Big Integer ('bigz') object of length 3:
[1] 3 5 5
75*(1-1/3)*(1-1/5)
[1] 40
```

###<font color="green">3^m*7^n</font>集(<font color="blue">Set</font>)
<font color="green">21,63</font>の<font color="green">2</font>個。

```R
factorize(21)
Big Integer ('bigz') object of length 2:
[1] 3 7
21*(1-1/3)*(1-1/7)
[1] 12

factorize(63)
Big Integer ('bigz') object of length 3:
[1] 3 3 7
63*(1-1/3)*(1-1/7)
[1] 36 
```

###<font color="green">2^l*3^m^5^n</font>集(<font color="blue">Set</font>)
<font color="green">30,60,90</font>の<font color="green">3</font>個だが<font color="green">60,90</font>がレンジ外（<font color="blue">2*2*3*5と2*3*3*5が1桁の計算に収まらない</font>）

```R
factorize(30)
Big Integer ('bigz') object of length 3:
[1] 2 3 5
30*(1-1/2)*(1-1/3)*(1-1/5)
[1] 8

factorize(60)
Big Integer ('bigz') object of length 4:
[1] 2 2 3 5
60*(1-1/2)*(1-1/3)*(1-1/5)
[1] 16
factorize(90)
Big Integer ('bigz') object of length 4:
[1] 2 3 3 5
90*(1-1/2)*(1-1/3)*(1-1/5)
[1] 24
```

###<font color="green">5^m*7^n</font>集(<font color="blue">Set</font>)
<font color="green">35</font>の<font color="green">1</font>個

```R
factorize(35)
Big Integer ('bigz') object of length 2:
[1] 5 7
35*(1-1/5)*(1-1/7)
[1] 24
```

###<font color="green">2^l*3^m^7^n</font>集(<font color="blue">Set</font>)
<font color="green">42,84</font>の<font color="green">2</font>個だが<font color="green">84</font>がレンジ外（<font color="blue">2*2*3*7が1桁の計算に収まらない</font>）

```R
factorize(42)
Big Integer ('bigz') object of length 3:
[1] 2 3 7
42*(1-1/2)*(1-1/3)*(1-1/7)
[1] 12

factorize(84)
Big Integer ('bigz') object of length 4:
[1] 2 2 3 7
84*(1-1/2)*(1-1/3)*(1-1/7)
[1] 24
```

###<font color="green">2^l*5^m^7^n</font>集(<font color="blue">Set</font>)
<font color="green">70</font>の<font color="green">1</font>個だがレンジ外（<font color="blue">2*5*7が1桁の計算に収まらない</font>）

```R
factorize(70)
Big Integer ('bigz') object of length 3:
[1] 2 5 7
70*(1-1/2)*(1-1/5)*(1-1/7)
[1] 24
```

###<font color="green">2^h*3^l*5^m^7^n</font>集(<font color="blue">Set</font>)
<font color="green">10</font>以下の素数をすべて含んだ形だが、どうやってもレンジ外となる。

```R
factorize(210)
Big Integer ('bigz') object of length 4:
[1] 2 3 5 7
210*(1-1/2)*(1-1/3)*(1-1/5)*(1-1/7)
[1] 48
```

まとめると…

- **1**が<font color="green">1</font>個
- **2^n集**(<font color="blue">Set</font>)(<font color="green">2,4,8,16,32,64</font>)が<font color="green">6</font>個
- **3^n集**(<font color="blue">Set</font>)(<font color="green">3,9,27,81</font>)が<font color="green">4</font>個
- **5^n集**(<font color="blue">Set</font>)(<font color="green">5,25</font>)が<font color="green">2</font>個
- **2^m*3^n集**(<font color="blue">Set</font>)(<font color="green">6,12,18,24,36,48,54,72,96</font>)が<font color="green">9</font>個だが<font color="green">96</font>がレンジ外（<font color="blue">2*2*2*2*2*3が1桁の計算に収まらない</font>）
- **7^n集**(<font color="blue">Set</font>)(<font color="green">7,49</font>)が<font color="green">2</font>個

ここまでで掛ける側に登場する数字(<font color="blue">1~9</font>)は網羅。小計<font color="green">23</font>個。

- **2^m*5^m集**(<font color="blue">Set</font>)(<font color="green">10,20,40,50,80</font>)が<font color="green">5</font>個だが<font color="green">20,80</font>がレンジ外（<font color="blue">2*2*5と2*2**2*2*5が1桁の計算に収まらない</font>）
- **2^m*7^m集**(<font color="blue">Set</font>)(<font color="green">14,28,56,98</font>)が<font color="green">4</font>個だが<font color="green">98</font>がレンジ外（<font color="blue">2*2*2*2*7が1桁の計算に収まらない</font>）
- **3^m*5^n集**(<font color="blue">Set</font>)(<font color="green">15,45,75</font>)が<font color="green">3</font>個だが<font color="green">75</font>がレンジ外（<font color="blue">3*5*5が1桁の計算に収まらない</font>)
- **3^m*7^n集**(<font color="blue">Set</font>)(<font color="green">21,63</font>)が<font color="green">2</font>個
- **2^l*3^m^5^n集(<font color="blue">Set</font>)**(<font color="green">30,60,90</font>)が<font color="green">3</font>個だが<font color="green">60,90</font>がレンジ外（<font color="blue">2*2*3*5と2*3*3*5が1桁の計算に収まらない</font>）
- **5^m*7^n集**(<font color="blue">Set</font>)(<font color="green">35</font>)が<font color="green">1</font>個
- **2^l*3^m^7^n集**(<font color="blue">Set</font>)(<font color="green">42,84</font>)が<font color="green">2</font>個だが<font color="green">84</font>がレンジ外（<font color="blue">2*2*3*7が1桁の計算に収まらない</font>）
- **2^l*5^m^7^n集**(<font color="blue">Set</font>)(<font color="green">70</font>)が<font color="green">1</font>個だがレンジ外（<font color="blue">2*5*7が1桁の計算に収まらない</font>） 

追加で<font color="green">13</font>個。かくして九九に使用される数字は<font color="green">36</font>個となる。 除外されたのは…

<font color="green">100</font>以下<font color="green">1</font>桁以上の素数が

- <font color="green">11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97</font>の<font color="green">21</font>個

その倍数まで含めると

- **11集**(<font color="blue">Set</font>)(<font color="green">11,22,33,44,55,66,77,88,99</font>)の<font color="green">9</font>個
- **13集**(<font color="blue">Set</font>)(<font color="green">13,26,39,52,65,78,91</font>)の<font color="green">7</font>個
- **17集**(<font color="blue">Set</font>)(<font color="green">17,34,51,68,85</font>)の<font color="green">5</font>個
- **19集**(<font color="blue">Set</font>)(<font color="green">19,38,57,76,95</font>)の<font color="green">5</font>個
- **23集**(<font color="blue">Set</font>)(<font color="green">23,46,69,92</font>)の<font color="green">4</font>個
- **29集**(<font color="blue">Set</font>)(<font color="green">29,58,87</font>)の<font color="green">3</font>個
- **31集**(<font color="blue">Set</font>)(<font color="green">31,62,93</font>)の<font color="green">3</font>個
- **37集**(<font color="blue">Set</font>)(<font color="green">37,74</font>)の<font color="green">2</font>個
- **41集**(<font color="blue">Set</font>)(<font color="green">41,82</font>)の<font color="green">2</font>個
- **43集**(<font color="blue">Set</font>)(<font color="green">43,86</font>)の<font color="green">2</font>個
- **47集**(<font color="blue">Set</font>)(<font color="green">47,94</font>)の<font color="green">2</font>個
- **単独出現**(<font color="green">53,59,61,67,71,73,79,83,89,97</font>)が<font color="green">10</font>個

ここまでの合計が<font color="green">54</font>個。そして合成数だが1桁の計算に収まらないのが<font color="green">20,60,70,75,80,84,90,96,98</font>の<font color="green">9</font>個

```R
#九九で使われる数(36個)
c009<-c(c(1),c(2,4,8,16,32,64),c(3,9,27,81),c(5,25),c(6,12,18,24,36,48,54,72),c(7,49))
c100<-c(c(10,40,50),c(14,28,56),c(15,45),c(21,63),c(30),c(35),c(42))
c99<-c(c009,c100)
length(c99)
[1] 36

#レンジ超過除外分(9個)
ce99<-c(20,60,70,75,80,84,90,96,98)

#100以下1桁以上の素数とその倍数(54個)

d100<-c(c(11,22,33,44,55,66,77,88,99),c(13,26,39,52,65,78,91),c(17,34,51,68,85),c(19,38,57,76,95),c(23,46,69,92),c(29,58,87),c(31,62,93),c(37,74),c(41,82),c(43,86),c(47,94),c(53,59,61,67,71,73,79,83,89,97))

length(d100)

[1] 54

ttl01<-c(c99,ce99,d100)
setdiff(c(1:99),ttl01)

integer(0)
```

 「**レンジオーバー項目の発見と除去**」は結局、最終的に人力で遂行。何かうまいアルゴリズムがありますかね？
[ナップサック問題-Wikipedia-](https://ja.wikipedia.org/wiki/%E3%83%8A%E3%83%83%E3%83%97%E3%82%B5%E3%83%83%E3%82%AF%E5%95%8F%E9%A1%8C)

#「**重複組み合わせ**（<font color="blue">記号Ｈ</font>）」による算出方法？
ちなみに一般には「**九九で覚えるべき計算が36種類**」である事と混同されてる側面も?
[かけ算九九は36パターンだけでOK](http://tbkdonguri.wp.xdomain.jp/2017/07/21/860)
>では、いくつ覚えればいいかというと、「１」を含むかけ算（１の段）は計算しなくても分かるので外すとして、「２」から「９」までの８種類の数を、２つ取り出す場合の組み合わせの数だけとなります。その際、３×３のように同じ数を取り出す組み合わせも１つとしてカウントします。これは数学でいう「**重複組み合わせ**（<font color="blue">記号Ｈ</font>）」で求められ、全部で36個の組み合わせということになりますが、表を作って確かめた方が分かりやすいです。

![20170721_kakezan01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/a4e3d55b-143a-18a8-eb9b-418ccc5b43ac.gif)
[【初心者向け】階乗と順列と組み合わせ](https://qiita.com/ochimusha01/items/90d9ef0a224bdd604721)

```R
#「重複を含まない」1から9の数字の組み合わせも9C2は36個。
> choose(9,2)
[1] 36
> combn(c(1:9), 2)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17]
[1,]    1    1    1    1    1    1    1    1    2     2     2     2     2     2     2     3     3
[2,]    2    3    4    5    6    7    8    9    3     4     5     6     7     8     9     4     5
     [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25] [,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33]
[1,]     3     3     3     3     4     4     4     4     4     5     5     5     5     6     6     6
[2,]     6     7     8     9     5     6     7     8     9     6     7     8     9     7     8     9
     [,34] [,35] [,36]
[1,]     7     7     8
[2,]     8     9     9

#これから自明の場合(Trivial Case)で覚える必要がない「1の段(1*1~1*9)」を除き、かつ同数同士の組み合わせ「1*1=1,2*2=4,…,9*9=81」を足した重複組み合わせ8H2=(8-2-1)H2=9H2も結果は36個となる。
> factorial(9)/factorial(2)/factorial(9-2)
[1] 36
```
[九九の答えが36種類であることの証明](https://kunst1080.hatenablog.com/entry/2017/04/14/000903)

>規則性が見えそうで見えない・・・

色々擦り合わせが必要なのは明瞭ですが、とりあえず以下続報…

#ここまでのまとめ（<font color="blue">全体像の俯瞰</font>）。
たかが九九、されど九九…**整数論**(<font color="blue">Number Theory</font>)の一環に足を踏み入れた途端、急激に難易度が上がります。
[数論 -Wikipedia-](https://ja.wikipedia.org/wiki/%E6%95%B0%E8%AB%96)
>数、特に整数およびそれから派生する数の体系（<font color="blue">代数体、局所体など</font>）の性質について研究する数学の一分野である。整数論とも言う。
>ガウスは「**数学は科学の王女であり、数論は数学の王女である**」という言葉を残した。
>永らく実用性は無いと言われてきたが、近年暗号（<font color="blue">RSA,楕円曲線暗号</font>）や符号により計算機上での応用が発達しつつある。

- 最初に投稿した時点では「**族**」という言葉を使ったが、「**族**（<font color="blue">Family</font>）」なる用語には数学的にまた別の意味が与えられているので「**集**（<font color="blue">Set</font>）」なるより一般的数学用語に差し替えた。まぁ集合の一種には違いないので…

[族 (数学) - Wikipedia](https://ja.wikipedia.org/wiki/%E6%97%8F_(%E6%95%B0%E5%AD%A6))
>添字付けされた**元**（<font color="blue">要素</font>）の（<font color="blue">一般には非可算無限個の</font>）集まりで、**対**、**n-組**、**列**などの概念の一般化である。**系**（<font color="blue">けい、collection</font>）と呼ぶこともある。元がどのような対象であるかによって、**点族**、**集合族**（<font color="blue">集合系</font>）、**関数族**（<font color="blue">関数系</font>）などと呼ばれる。

- 一方、ここに登場した「<font color="red">レンジオーバー問題</font>」は、どうやら**NP**(<font color="blue">Non-deterministic Polynomial time（非決定性多項式時間）の略。複雑性クラスのひとつ</font>)**困難**(<font color="blue">NP-hard</font>)問題の一環としての「**ナップサック問題**（<font color="blue">Knapsack problem</font>）」に分類される模様だが、あまり詳しくないので現時点では放置。

[NP困難 -Wikipedia-](https://ja.wikipedia.org/wiki/NP%E5%9B%B0%E9%9B%A3)
>計算量理論において、問題が「**NPに属する任意の問題と比べて、少なくとも同等以上に難しい**」ことである。正確にいうと問題HがNP困難であるとは、「**NPに属する任意の問題LがHへ帰着可能である**」と定義される。

[ナップサック問題 -Wikipedia-](https://ja.wikipedia.org/wiki/%E3%83%8A%E3%83%83%E3%83%97%E3%82%B5%E3%83%83%E3%82%AF%E5%95%8F%E9%A1%8C)
>計算複雑性理論における計算の難しさの議論の対象となる問題の一つで、「**容量Cのナップサックが一つと、n種類の品物**（<font color="blue">各々、価値pi,容積ci</font>）**が与えられたとき、ナップサックの容量Cを超えない範囲でいくつかの品物をナップサックに詰め、ナップサックに入れた品物の価値の和を最大化するにはどの品物を選べばよいか**」という整数計画問題である。

ところで、ここでこれまで傾注してきた**幾何学世界**(<font color="blue">Geometry Set</font>)からのアプローチに視野を転じますと、また別の景色が浮かび上がってくるのです。

- 「(<font color="blue">辺長無限小1/Infの無限数Infの辺=頂点の集合と見做せる</font>)**円そのもの**(<font color="blue">Circle Itself</font>)/**球面そのもの**(<font color="blue">Sphere Itself</font>)」を出発点とする。
- 「**正多面体世界**(<font color="blue">Regular Polyhedron Set</font>)」においては「<font color="green">2^n集</font>」「<font color="green">3^n集</font>」「<font color="green">2^n3^m集</font>」といった**概念**(<font color="green">Concept</font>)の組み合わせだけで構築可能な世界(<font color="blue">正四面体、正六面体、正八面体に加え「断面」として三角形、四角形、正六角形が登場</font>)と「<font color="green">5^n集</font>」概念も導入(<font color="blue">Introduction</font>)された世界(<font color="blue">正十二面体、正二十面体</font>)の間に明らかに扱い上の難易度レベルの差が存在する。
- ましてや「<font color="green">7^n集</font>」概念まで導入された世界なんて…到底想像力がついていかない。

[【Rで球面幾何学】平方眼と立方眼の小宇宙(Square & Cube Grid Set)について。](https://qiita.com/ochimusha01/items/7347d2c004846df2fec5)
![20200207094535.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/50c9b16f-bd89-df18-8a2a-9ae775f4fa4a.png)
![20200207044808.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/fe7a0a07-fc3f-c8fc-418b-ef57c8d8438e.gif)
![Rplot21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/62b30119-db8b-a18a-6e58-b8cce11f28cc.png)
![Octahedron02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/6e64f26c-04fd-6724-434f-4a8dc3ac784e.gif)
![Rplot19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/1e36492f-10d2-84a3-0526-6aea1d1ff60b.png)
![icosahedron009.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/9068fd22-a331-a86d-49d6-8842b37e8f11.gif)
![dodecahedron051.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/e1111178-a73e-f381-32f1-a0336af7721a.gif)
![Rplot22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/65f5aa77-620b-eaa0-20e4-4b29789f3394.png)

- その一方で**正六面体**はその存在自体が既に「<font color="green">5^n集</font>」の世界に足を踏み入れているという話も…で、ここに「（<font color="blue">閉じた系(Close System)を構築すべく、その系で扱いきれない数理をまとめてある種の「誤差」として切り捨てる</font>）**隔壁**(<font color="blue">Partition</font>)問題」が急浮上してくる訳である。

[【Rで球面幾何学】正方形における平方対角線(Square diagonal)と立方体における立方対角線(Cubic diagonal)の関係について。](https://qiita.com/ochimusha01/items/9d899779ff8e814beb41)
![square002.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/f0f13c68-6fe1-495b-d0fb-0c5c4f3a292d.gif)

そう、まさに**ユークリッド幾何学**と**非ユークリッド幾何学**、**ニュートン力学**と**量子力学**の狭間に登場してくるアレ…現代人は何でもここからの逆算で考えねばならなくなってしまったのです。
[【Rで射影幾何学】そもそも「幾何学」とは何か？](https://qiita.com/ochimusha01/items/e3e6af4015e15b5777b9)

一方「**九九世界**(<font color="blue">Times Tables Set</font>)」は平然と「<font color="green">5^n集</font>」の概念ばかりか「<font color="green">7^n集</font>」の概念まで平然と足を踏み入れてきます。ちなみに海外では<font color="green">Times Tables</font>というと<font color="green">12*12</font>で覚えさせられる模様…それちょっと欲張り過ぎじゃないですかね？　そもそも**閉じた系**(<font color="blue">Closed System</font>)感が希薄だし、実際脱落者もゴロゴロ出すとか…
[かけ算九九、オーストラリアではどう学ぶ？](https://chiik.jp/articles/TUcga)

いずれにせよ私の関心は「<font color="red">人類はその認識可能範囲外を跋扈する絶対他者に対し、如何なる段階的隔壁を構築してきたか</font>」にあり、それがこうやって「<font color="green">２集・3集まで含む範囲内</font>」「<font color="green">５集まで含む範囲内</font>」「<font color="green">7集以上も視野に入れた範囲内</font>」みたいな形で**具体的数理**(<font color="blue">Mathematical things</font>)上の**定義**(<font color="green">Definition</font>)に統合されていくプロセス自体が楽しかったりします。やはり根はあくまで**文系人間**(<font color="green">Humanities Bacground Set</font>)の一員なんですね…
[【数理Computingの基礎】（人類の限界を乗り越えんとする）N進法/p進数の世界？](https://ochimusha02.hatenadiary.com/entry/2019/09/20/182256)
![20190530175206.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/0022d98f-552b-65b6-46bf-7144b6d21eb6.png)
![20190920071455.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/6c58a970-01cb-465f-efe9-d3dea0f90fe2.gif)

ならば、この態度に対峙すべき**理系人間**(<font color="blue">Technical Bacground Set</font>)の矜恃とは？　
[「矜持」の正しい使い方と「矜恃」との違いについて](https://eigobu.jp/magazine/kyouji)
これについても様々な答えが考えられそうですが（<font color="blue">その同様の形での数理的裏付けも含め</font>）以下続報…