システムに挑戦する アンドールシステムサポート株式会社

MENU

扇数について

扇数について

扇数の例 / 扇数を利用した計算精度低下の検出 / 扇数の関連動画
櫛数について 金字塔数について 扇階段数について

扇数とは?

1, 11, 111, …, 1111111111のように、1の連続だけで表す事ができる数の事を扇数と呼ぶ事にしました。
トランプカードでエースは「1」を示す記号です。
エースの札だけを沢山用意し、扇の様に広げた際に、それぞれの札を、各桁の数値と見立てて得られる値を、ここでは扇数と呼ぶ事にします。

「扇数」は数学的な専門用語では、repunit (repeated unitの省略)で、「レプユニット」、または「レピュニット」と呼ばれ、「単位反復数」とも訳されます。
このページやアンドールシステムサポートのYouTubeちゃんねる、電脳寺子屋 数学を学ぶシリーズの中では、出来るだけ短く表記したいので、「扇数」と呼ぶ事にします。

「repunit」は、Albert H. Beiler氏の著書RECREATIONS IN THEHORY OF NUMBERS – THE QUEEN OF MATHEMATICS ENTERTAINSの83ページから87ページ、CHPATER XIの中に記載されています。
また、この数は、インドのD. R. Kaprekar氏(1905-1986)の論文、Gunjikar, K. R.: Kaprekar, D, R (1939). “Theory of Demlo numbers” の中で、出てくる4. GENERAL EXPRESSION A linear number の式と一致しています。


扇数の数学的な定義: 10進数の場合 / n進数の場合 / 1桁値が異なる値の差分で得られる値 / n進数の1桁値が異なる値の差分で得られる値 / メルセンヌ数
扇数のPythonのコード: for文を利用した実装 n進数対応版 / 高速版 n進数対応版
扇数の発展: 下降扇数 / 櫛数 / 金字塔数 / 扇階段数

扇数の関連動画

アンドールシステムサポートのYouTubeちゃんねるでは「扇数」を題材とし、組み込みの開発に役立つ解説を行っております。

電脳寺子屋 数学を学ぶ「扇数と再帰関数」

扇関数を例に、再帰関数と組み込みにおけるスタック・メモリの影響について説明ます。

電脳寺子屋 数学を学ぶ「扇数とPython」- Pythonのすすめ

扇関数をC言語で実装した例と、Pythonで実装した例を通して、C言語に馴染んでいる方向けに、C言語の記述例とPythonの記述例を比較する形で、 Pythonの文法や特長の一部を紹介させて頂きます。

扇数の例

引数で指定した、桁数の、扇数の値を返す関数を、扇関数と呼ぶ事にします。
扇数は、様々な進数に適用する事が可能です。
どの進数を利用する場合であっても、1桁と0桁については、全ての進数で同じ値となります。
2桁以上のn進数の扇数の値は、どの進数として観測するのかにより、見える値が変化します。

表A1. n進数の扇関数が返す扇数の値
扇関数と引数 n進数の扇数の値 引数=桁数
\(A(0, base = n)\) \(0\) \(0\)
\(A(1, base = n)\) \(1\) \(1\)
\(A(2, base = n)\) \(11\) \(2\)
\(A(3, base = n)\) \(111\) \(3\)
\(A(4, base = n)\) \(1111\) \(4\)
\(A(5, base = n)\) \(11111\) \(5\)
\(A(6, base = n)\) \(111111\) \(6\)
\(A(7, base = n)\) \(1111111\) \(7\)
\(A(8, base = n)\) \(11111111\) \(8\)
\(A(9, base = n)\) \(111111111\) \(9\)
\(A(10, base = n)\) \(1111111111\) \(10\)

扇関数に対し、2進数の値を返すように指定し、2進数として観測した場合と、この値を10進数に変換して表記した結果を、下記の表に示します。

表A2. 2進数の場合の扇数の値と素数との関係 – (Mersenne prime)
扇関数と引数 2進数とした観測した値 10進数表記 素数? 引数=桁数
\(A(0,base=2)\) \(0b0\) \(0\) \(0\)
\(A(1,base=2)\) \(0b1\) \(1\) \(1\)
\(A(2,base=2)\) \(0b11\) \(3\) \(2\)
\(A(3,base=2)\) \(0b111\) \(7\) \(3\)
\(A(4,base=2)\) \(0b1111\) \(15\) \(4\)
\(A(5,base=2)\) \(0b11111\) \(31\) \(5\)
\(A(6,base=2)\) \(0b111111\) \(63\) \(6\)
\(A(7,base=2)\) \(0b1111111\) \(127\) \(7\)
\(A(8,base=2)\) \(0b11111111\) \(255\) \(8\)
\(A(9,base=2)\) \(0b111111111\) \(511\) \(9\)
\(A(10,base=2)\) \(0b1111111111\) \(1023\) \(10\)

2進数の扇数の値は、メルセンヌ数(Mersenne prime)とも呼ばれ、非常に高い確率で素数の値となります。

一般的には10進数を利用する事が多いので、扇関数に対して、n進数の指定を省いた場合は、10進数の値を扱う事とします。
\(A(x)=A(x, base = 10)\)

扇数の数学的な定義とPythonのコード

10進数の扇数は、初項=1、一般項を項数から1つ減らした値の、10の累乗とする数列の総和となります。
これは、公比を10とする等比数列の和でもあります。

\( A(x)= 10^0+10^1+10^2+\cdots+10^{x-2}+10^{x-1} \)

総和の記法である、Σ(シグマ)を利用して、10進数のx桁の扇数を返す扇関数を記述すると下記式になります。

\(A(x)=\displaystyle \sum_{k=1}^{x}10^{k-1}\)

上記の総和の式の様に「x」個までの値を数える際に、一般的な数値の数え方では「1」をはじめの値としますが、
プログラムの世界では「0」をはじめの値として扱う事が多いです。この場合には、終わりに値は「x-1」となり、総和の式を「0」をはじめとして書き換えると下記の式となります。

\(A(x)=\displaystyle \sum_{k=0}^{x-1}10^{k}\)

for文を利用して実装したPythonのコード

総和の式をPythonで関数として記述すると下記の関数となります。

def A(x):
   s = 0
   for k in range (0, x):
       s += 10**k
   return s
関数の仕様
関数名:
A
機能:
扇数の値を返す
戻り値:
10進数でx個の1が連続した扇数の値
引数:
x (0以上の整数の値)
扇数に含まれる1の個数 = 桁数

等比数列の和には公式が存在します
等比数列 (G.P. : geometric prgression)とは初項\(a\)に対して、公比\(n\)を掛けて得られる数列の事です。

\(\underbrace{a \times n^{0}, a \times n^{1}, a \times n^{2}, \cdots , a \times n^{x – 1}}_{x\text{個}}\)

項数を\(x\)とした際の「等比数列の一般項」は \(a_{x} = a \times n^{x-1}\)となります。

等比数列には和の公式が存在します。

\(S_{x}\)を項数\(x\)の等比数列の総和とした場合には下記の式が成り立ちます。

\(n = 1\) のとき \(S_{x} = a \times x\) となり、

\(n \neq 1\) のとき\(S_{x} = \displaystyle \frac {a(n^{x} – 1)}{n – 1}\)となります。

10進数の扇数(repunit)とは、初項\(a = 1\)、公比\(n = 10\)とし、項数を\(x\)とした、等比数列の総和という事ができます。


参考文献:
岩瀬 重雄 氏の著書「高校数学 公式活用事典 第五版」 初版発行:1986年2月20日、第五版発行: 2022年2月17日、重版発行: 2025年、発行所: 株式会社 旺文社、ISBN978-4-01-075276-0、302ページ

Albert H. Beiler氏の著書「RECREATIONS IN THEHORY OF NUMBERS – THE QUEEN OF MATHEMATICS ENTERTAINS」 SECOND EDITION DOVER PUBLICATIONS, INC、第2版:1966年 ,初版: 1964年, ISBN-13: 978–0-4866-21096-4, ISBN-10: 0-486-21096-0、ページ83~87

この公式を利用すると下記の式となります。

\( A(x)= \displaystyle \frac{10^x-1}{9} \)

高速化したPythonのコード

等比数列の総和を求める公式から得た上記の式を、Pythonで関数として記述すると下記の関数となります。

def A(x):
   return ((10**x)-1) // 9
関数の仕様
関数名:
A
機能:
扇数の値を返す
戻り値:
10進数でx個の1が連続した扇数の値
引数:
x (0以上の整数の値)
扇数に含まれる1の個数 = 桁数

1桁値が異なる扇数どうしの値の差分で得られる値

\(x\)を整数とした場合、\(x > 0\) の条件で下記の式が成り立ちます。
\(A(x) – A(x-1) = 10^{x – 1}\)

n進数の扇数の数学的な定義

n進数の扇数は、初項=1、一般項を項数から1つ減らした値の、nの累乗とする数列の総和となります。
これは、公比をnとする等比数列の和でもあります。

\( A(x, base = n)= n^0+n^1+n^2+\cdots+n^{x-2}+n^{x-1} \)

総和の記法である、Σ(シグマ)を利用して、n進数のx桁の扇数を返す扇関数を記述すると下記式になります。

\(A(x, base = n)=\displaystyle \sum_{k=1}^{x}n^{k-1}\)

上記の総和の式の様に「x」個までの値を数える際に、一般的な数値の数え方では「1」をはじめの値としますが、
プログラムの世界では「0」をはじめの値として扱う事が多いです。この場合には、終わりに値は「x-1」となり、総和の式を「0」をはじめとして書き換えると下記の式となります。

\(A(x, base = n)=\displaystyle \sum_{k=0}^{x-1}n^{k}\)

for文を利用して実装したPythonのコード

総和の式をPythonで関数として記述すると下記の関数となります。

def A(x, base = 10):
   s = 0
   for k in range (0, x):
       s += base**k
   return s
関数の仕様
関数名:
A
機能:
扇数の値を返す
戻り値:
n進数でx個の1が連続した扇数の値
引数:
x (0以上の整数の値)
扇数に含まれる1の個数 = 桁数
base = 10 (baseは2以上の整数の値)、省略可能(省略された場合はbase=10)
n進数の底
等比数列の和の公式が存在します
等比数列 (G.P. : geometric prgression)とは初項\(a\)に対して、公比\(n\)を掛けて得られる数列の事です。

\(\underbrace{a \times n^{0}, a \times n^{1}, a \times n^{2}, \cdots , a \times n^{x – 1}}_{x\text{個}}\)

項数を\(x\)とした際の「等比数列の一般項」は \(a_{x} = a \times n^{x-1}\)となります。

等比数列には和の公式が存在します。

\(S_{x}\)を項数\(x\)の等比数列の総和とした場合には下記の式が成り立ちます。

\(n = 1\) のとき \(S_{x} = a \times x\) となり、

\(n \neq 1\) のとき\(S_{x} = \displaystyle \frac {a(n^{x} – 1)}{n – 1}\)となります。

n進数の扇数(repunit)とは、初項\(a = 1\)、公比\(n \)とし、項数を\(x\)とした、等比数列の総和という事ができます。


参考文献:
岩瀬 重雄 氏の著書「高校数学 公式活用事典 第五版」 初版発行:1986年2月20日、第五版発行: 2022年2月17日、重版発行: 2025年、発行所: 株式会社 旺文社、ISBN978-4-01-075276-0、302ページ

Albert H. Beiler氏の著書「RECREATIONS IN THEHORY OF NUMBERS – THE QUEEN OF MATHEMATICS ENTERTAINS」 SECOND EDITION DOVER PUBLICATIONS, INC、第2版:1966年 ,初版: 1964年, ISBN-13: 978–0-4866-21096-4, ISBN-10: 0-486-21096-0、ページ83~87

この公式に条件を代入すると下記の式となります。

\( A(x, base = n)= \displaystyle \frac{n^x-1}{n-1} \)

高速化したPythonのコード

等比数列の総和公式から得た上記の式をPythonで関数として記述すると下記の関数となります。

def A(x, base = 10):
   return ((base**x)-1) // (base - 1)
関数の仕様
関数名:
A
機能:
扇数の値を返す
戻り値:
n進数でx個の1が連続した扇数の値
引数:
x (0以上の整数の値)
扇数に含まれる1の個数 = 桁数
base = 10 (baseは2以上の整数の値)、省略可能(省略された場合はbase=10)
n進数の底

ちなみに、Pythonの関数に対する仮引数の定義である「base = 10」は、この引数が省略された場合には、baseに10を代入するという意味です。
従って、\(A(x) = A(x,10)\)となります。

n進数の1桁値が異なる扇数どうしの値の差分で得られる値

\(x\)を整数とした場合、\(x > 0\) の条件で下記の式が成り立ちます。
\(A(x, base = n) – A(x-1, base = n) = n^{x – 1}\)

扇数の応用

桁数が異なる扇数の差分で得られる値は、関数の有効桁数や計算の精度の確認に有効です。
実際の有効桁数については、そのアプリの用途によって異なりますが、扇数を利用すると、単純な10の累乗を利用する場合と異なり、 関数の戻り値として、どの桁まで、入力された値の桁が反映されるのかが一目瞭然となります。
ライブラリがバイナリだけで、提供され、もとのソースコードが提供されない場合があります。
また、ライセンスによって、逆アセンブラを利用したリバースエンジニアリングが禁止されている場合もあります。
このような場合は、関数をある種のブラック・ボックスと見なして、開発するアプリケーションの仕様として入力される値の範囲で、必要十分な有効精度を持った結果を返す事ができる関数であることを確認する事が求められる場合があります。
このような場合のテストに使用する入力値として扇数の概念が利用できます。
AIによって生成された関数のコードをブラック・ボックスとして扱い、入力された値と出力された値の関係から問題が無い事をテストする場合にも扇数の概念が役立ちます。

BlackBox_Aと BlackBox_B関数について

下記の2つの関数をブラックボックスと仮定して考えてみます。

BlackBox_Aは、引数の値をそのまま2倍した結果を返す関数です。

def BlackBox_A(x):
	return x * 2

BlackBox_Bは、引数の値を2倍した、結果を一度、浮動小数に変換した後に、整数に戻す処理を行う関数です。
BlackBox_B関数では、倍精度浮動小数が提供できる精度まで落ちる結果となります。

def BlackBox_B(x):
	return int(float(x * 2))

この2つの関数の中身が見えない場合には、どの様にテストすれば、計算精度が低下することを検出できるようになるのでしょうか?
10の累乗の値と、扇数どうしの差分の値を利用する2つのテスト関数を作成し、結果を比較した例を下記に示します。

10の累乗の値を入力値として被検査対象の関数の値を出力させるテスト関数の例

下記のTest10関数は、引数として渡されたテスト対象の関数に対して、 10の累乗の値を代入し、結果を求める関数です。

def Test10(x, fun):
	for d in range(x-1, -1, -1):
		a = 10**(x-d-1)
		y = fun(a)
		print(y, "= fun(x), x=", a, "=10**", x-d)

1桁から引数で渡されたxの値の桁数までの値を表示する関数です。 引数funはテスト対象の関数を指定します。

BlackBox_A関数を10の累乗を利用してテストするTest10関数を使ってテストを行った結果を下記に示します。

>>> Test10(19, BlackBox_A)
2 = fun(x), x= 1 =10** 0
20 = fun(x), x= 10 =10** 1
200 = fun(x), x= 100 =10** 2
2000 = fun(x), x= 1000 =10** 3
20000 = fun(x), x= 10000 =10** 4
200000 = fun(x), x= 100000 =10** 5
2000000 = fun(x), x= 1000000 =10** 6
20000000 = fun(x), x= 10000000 =10** 7
200000000 = fun(x), x= 100000000 =10** 8
2000000000 = fun(x), x= 1000000000 =10** 9
20000000000 = fun(x), x= 10000000000 =10** 10
200000000000 = fun(x), x= 100000000000 =10** 11
2000000000000 = fun(x), x= 1000000000000 =10** 12
20000000000000 = fun(x), x= 10000000000000 =10** 13
200000000000000 = fun(x), x= 100000000000000 =10** 14
2000000000000000 = fun(x), x= 1000000000000000 =10** 15
20000000000000000 = fun(x), x= 10000000000000000 =10** 16
200000000000000000 = fun(x), x= 100000000000000000 =10** 17
2000000000000000000 = fun(x), x= 1000000000000000000 =10** 18

BlackBox_B関数を10の累乗を利用してテストするTest10関数を使ってテストを行った結果を下記に示します。

>>> Test10(19, BlackBox_B)
2 = fun(x), x= 1 =10** 0
20 = fun(x), x= 10 =10** 1
200 = fun(x), x= 100 =10** 2
2000 = fun(x), x= 1000 =10** 3
20000 = fun(x), x= 10000 =10** 4
200000 = fun(x), x= 100000 =10** 5
2000000 = fun(x), x= 1000000 =10** 6
20000000 = fun(x), x= 10000000 =10** 7
200000000 = fun(x), x= 100000000 =10** 8
2000000000 = fun(x), x= 1000000000 =10** 9
20000000000 = fun(x), x= 10000000000 =10** 10
200000000000 = fun(x), x= 100000000000 =10** 11
2000000000000 = fun(x), x= 1000000000000 =10** 12
20000000000000 = fun(x), x= 10000000000000 =10** 13
200000000000000 = fun(x), x= 100000000000000 =10** 14
2000000000000000 = fun(x), x= 1000000000000000 =10** 15
20000000000000000 = fun(x), x= 10000000000000000 =10** 16
200000000000000000 = fun(x), x= 100000000000000000 =10** 17
2000000000000000000 = fun(x), x= 1000000000000000000 =10** 18

Test10(x, fun)関数でテストした場合、1~10の18乗までの10の累乗の値、19桁までの19通りの値を入れても、 BlackBox_Aと BlackBox_B関数で全く同じ値を返すため、精度の問題を検出する事はできません。

扇数の差分の値を入力値として被検査対象の関数の値を出力させるテスト関数の例

扇数を返す扇関数を利用して扇数の差分をテスト用の値とするテスト関数を下記に示します。

def TestA(x, fun):
	for d in range(x-1, -1, -1):
		a = A(x) -A(d)
		y = fun(a)
		print(y, "= fun(x), x=",a, "=A(",x,")-A(", d,")")

10進数で、扇数を扇数で引いた値は、差の桁数が小さくなるほど10の累乗の値に近づくという性質があります。
この性質を利用する事で、10の累乗から扇数に至るまで連続した値を作る事ができます。
この値を利用して先ほどの、 BlackBox_Aと BlackBox_B関数に与えて、結果を比較してみましょう。

BlackBox_A関数を扇数の差分を利用してテストするTestA関数を使ってテストを行った結果を下記に示します。

>>> TestA(18,BlackBox_A)
200000000000000000 = fun(x), x= 100000000000000000 =A( 18 )-A( 17 )
220000000000000000 = fun(x), x= 110000000000000000 =A( 18 )-A( 16 )
222000000000000000 = fun(x), x= 111000000000000000 =A( 18 )-A( 15 )
222200000000000000 = fun(x), x= 111100000000000000 =A( 18 )-A( 14 )
222220000000000000 = fun(x), x= 111110000000000000 =A( 18 )-A( 13 )
222222000000000000 = fun(x), x= 111111000000000000 =A( 18 )-A( 12 )
222222200000000000 = fun(x), x= 111111100000000000 =A( 18 )-A( 11 )
222222220000000000 = fun(x), x= 111111110000000000 =A( 18 )-A( 10 )
222222222000000000 = fun(x), x= 111111111000000000 =A( 18 )-A( 9 )
222222222200000000 = fun(x), x= 111111111100000000 =A( 18 )-A( 8 )
222222222220000000 = fun(x), x= 111111111110000000 =A( 18 )-A( 7 )
222222222222000000 = fun(x), x= 111111111111000000 =A( 18 )-A( 6 )
222222222222200000 = fun(x), x= 111111111111100000 =A( 18 )-A( 5 )
222222222222220000 = fun(x), x= 111111111111110000 =A( 18 )-A( 4 )
222222222222222000 = fun(x), x= 111111111111111000 =A( 18 )-A( 3 )
222222222222222200 = fun(x), x= 111111111111111100 =A( 18 )-A( 2 )
222222222222222220 = fun(x), x= 111111111111111110 =A( 18 )-A( 1 )
222222222222222222 = fun(x), x= 111111111111111111 =A( 18 )-A( 0 )

BlackBox_B関数を扇数の差分を利用してテストするTestA関数を使ってテストを行った結果を下記に示します。

>>> TestA(18,BlackBox_B)
200000000000000000 = fun(x), x= 100000000000000000 =A( 18 )-A( 17 )
220000000000000000 = fun(x), x= 110000000000000000 =A( 18 )-A( 16 )
222000000000000000 = fun(x), x= 111000000000000000 =A( 18 )-A( 15 )
222200000000000000 = fun(x), x= 111100000000000000 =A( 18 )-A( 14 )
222220000000000000 = fun(x), x= 111110000000000000 =A( 18 )-A( 13 )
222222000000000000 = fun(x), x= 111111000000000000 =A( 18 )-A( 12 )
222222200000000000 = fun(x), x= 111111100000000000 =A( 18 )-A( 11 )
222222220000000000 = fun(x), x= 111111110000000000 =A( 18 )-A( 10 )
222222222000000000 = fun(x), x= 111111111000000000 =A( 18 )-A( 9 )
222222222200000000 = fun(x), x= 111111111100000000 =A( 18 )-A( 8 )
222222222220000000 = fun(x), x= 111111111110000000 =A( 18 )-A( 7 )
222222222222000000 = fun(x), x= 111111111111000000 =A( 18 )-A( 6 )
222222222222200000 = fun(x), x= 111111111111100000 =A( 18 )-A( 5 )
222222222222220000 = fun(x), x= 111111111111110000 =A( 18 )-A( 4 )
222222222222222016 = fun(x), x= 111111111111111000 =A( 18 )-A( 3 )
222222222222222208 = fun(x), x= 111111111111111100 =A( 18 )-A( 2 )
222222222222222208 = fun(x), x= 111111111111111110 =A( 18 )-A( 1 )
222222222222222208 = fun(x), x= 111111111111111111 =A( 18 )-A( 0 )

\(111111111111111000 = A(18) – A(3)\)という値を入力した結果、BlackBox_A関数は\(222222222222222000\)、BlackBox_B関数では\(222222222222222016\)と出力される値が異なっている事が分かります。
また、BlackBox_B関数に対して、下記の3つの値を入力した場合の出力結果に注目して見ましょう。
\(111111111111111100 = A(18) – A(2)\)
\(111111111111111110 = A(18) – A(1)\)
\(111111111111111111 = A(18) – A(0)\)
それぞれ、異なる値を入力しているにも関わらず、\(222222222222222208\)という同じ値が返っているため、BlackBox_B関数では、精度が失われている事が分かります。

扇数の発展

扇数は更に、発展させて考える事ができます。

下降扇数 櫛数 金字塔数 扇階段数

下降扇数

扇数は整数から、浮動小数点へ拡張して考える事ができます。

通常の扇数(repunit)は桁数が増えると、上位の桁に向かって上昇する方向に値が増えます。

\(1\), \(11\), \(111\), \(111\ldots1\)

下記の式は、上昇(Ascending)方向に広がる扇数を返す(上昇)扇関数\(A(x)\)となり、常に整数の値となります。

\(A(x, base = n)=\displaystyle \sum_{k=0}^{x-1}n^{k}\)


下記に示すように、下位の桁に向かって下降する方向に値が増える扇数も考える事ができます。

\(1\), \(1.1\), \(1.11\), \(1.11\ldots1\)

下記の式は、下降(Descending)方向に広がる扇数を返す関数となり、小数点以下の桁数が増えていきます。

\(D(x, base = n)=\displaystyle \sum_{k=0}^{x-1}n^{-k}\)

下降方向に広がる扇数である下降扇数を返す下降扇関数\(D(x)\)は、上昇方向に広がる扇数と組み合わせて利用することで、浮動小数点のデーター型を利用し、小数点以下の値も意味を持つ関数に対し、ブラックボックス・テスト用の入力値として役立つ値になると考えられます。
また、この後、紹介する櫛数や金字塔数等の概念と組合わせて利用する事もできます。

浮動小数点演算では、仮数の桁に収まらない値は、最下位の値が(利用されるライブラリやハードの設定に従って)切り捨てや丸めなどの処理が行われるため、下位の値の精度が下がります。
アンドールシステムサポートのYouTubeちゃんねる「電脳寺子屋」の動画の中で取り上げる予定ですが、浮動小数点の演算では、演算を行う順序によって、求める事ができる値の精度が変化します。
複数の値を足し合わせる場合には、絶対値の小さな値どうしを順番に足し合わせたものの方が、絶対値の大きな値と小さな値を足し合わせたものよりも、精度が高い値となります。

櫛数

桁数が割り切れる値の扇数で、扇数を割る事で櫛の歯のように 1と0の値の組み合わせの値を得る事ができます。
このページやアンドールのYouTubeちゃんねるの中では、下記の計算式で得れる値\(c\)を櫛数と呼ぶ事にしました。

\(A(x \times d, base = n) \div A(d, base = n) = c\)

扇数を扇数をで割る事は、扇数の桁数どうしの割算となり、進数の変換が発生します。

櫛数になる扇数どうしの割算の例 :

\(A(8, 10) \div A(2, 10) = 11111111 \div 11 = 1010101\)
\(A(8, 10) \div A(4, 10) = 11111111 \div 1111 = 10001\)

nのd乗進数から見たn進数の扇数が櫛数の正体です。

\(c = A(x, base = n^d)\)

櫛数と扇数の対応の例

\(1010101 = A(4, 10^2)\)
\(10001 = A(2, 10^4)\)
櫛数の詳細はこちら

金字塔数

10進数では、9桁までの扇数どうしを掛け合わせると、最上の桁と最下位の桁を1とし、中央の桁数が掛け合わせた扇数の低い方の値となります。

\(A(x_a, base = n) \times A(x_b, base = n) = p\)

扇数どうしを掛け合わせることで得られる数値\(p\)を、このページやアンドールのYouTubeちゃんねるの中では金字塔数と呼ぶ事にしました。

12,345,678,987,654,321のように、扇数(repunit)を自乗して得られる値の事を数学の世界ではデムロ数(Demlo numbers)と呼んでいます。

English版のWikipediaの記述によると、インドのD. R. Kaprekar氏(1905-1986)によりデムロ数(Demlo numbers)と命名された数とされており、参考文献がGunjikar, K. R.: Kaprekar, D, R (1939). “Theory of Demlo numbers” . J. Univ. Bombay. VII(3):3-9.という記載がありますが、Albert H. Beiler氏の著書RECREATIONS IN THE HORY OF NUMBERS – THE QUEEN OF MATHEMATICS ENTERTAINSのCHPATER VIII – DIGHITS-AND THE MAGIC OF NUMBERSの63ページに記載されているTABLE29の中でREPUNITの自乗として既に定義が記載されおり、尚且つこちらの表はF. B. Selkin in the Teachers College Record, Vol. 12, p. 68からの引用したものであるという記載があります。
このAlbert H. Beiler氏の著書の参考文献の一覧ページ66ではSelkin, F. B “Number Games Bordering on Arithmetic and Algebra, ” Teachers College Recored, 13 (1912), 68.とありますので、K. R. GUNJIKAR氏とD. R. KAPREKAR氏の独立再発見と考えられます。

金字塔数の詳細はこちら

扇階段数

\(1, 12, 123, \ldots , 123456789\)のように、\(1\)桁の扇数から\(x\)桁の扇数までの順番に連続した値を、足し合わせて得られる値を、このページとアンドールシステムサポートのYouTubeちゃんねるでは、扇階段数と呼ぶ事にしました。

10進数で10桁までの扇数の値について
表A3. 扇階段関数が返す扇階段数の値
扇階段関数と引数 10進数の扇数の値 引数は1から合計する連続した扇数の桁数
\(S(0)\) \(0\) \(0\)
\(S(1)\) \(1\) \(1\)
\(S(2)\) \(12\) \(2\)
\(S(3)\) \(123\) \(3\)
\(S(4)\) \(1234\) \(4\)
\(S(5)\) \(12345\) \(5\)
\(S(6)\) \(123456\) \(6\)
\(S(7)\) \(1234567\) \(7\)
\(S(8)\) \(12345678\) \(8\)
\(S(9)\) \(123456789\) \(9\)
\(S(10)\) \(1234567900\) \(10\)

\(s = 1 + 11+ 111 + \cdots + 111\ldots1\)

上記の式で求まる\(s\)を扇階段数と呼びます。

\(x\)桁のまでの扇数の合計で得られる階段数を求める関数を、扇階段関数 \(S(x)\)とした場合に、扇関数\(A(x)\)を利用すると下記の様に定義する事ができます。

\(S(x) = A(1) + A(2) + A(3) + \cdots + A(x)\)

つまり、扇階段関数は一般項を扇数とする数列の総和と言えます。

総和の記法である、Σ(シグマ)を利用して、10進数のx桁の扇数を返す扇関数を記述すると下記式になります。

\(S(x)=\displaystyle \sum_{k=1}^{x}A(k)\)

扇階段数の詳細はこちら

Arm社純正開発ツール

Arm社純正開発ツール

お知らせ

PAGETOP