櫛数について
櫛数とは? / 扇数とは?櫛関数の数式:10進数の場合 / n進数の場合
櫛関数の返す値の例: 10進数の場合
櫛関数をPythonで記述した例:10進数向けの実装 / n進数向けの実装
扇数を求めるPythonのコード:n進数向けの実装
扇数について 金字塔数について 扇階段数について
櫛数とは?
櫛は、髪を梳かすための道具として、等間隔に設けられた複数の歯が付いた道具です。
数値の各桁の値を数列と見なし、「1」を櫛の歯、「0」を隙間と見なす、「1」と「0」だけの値からなる数値を櫛数と呼ぶ事にしました。
例えば、櫛歯の本数が4本、隙間を1本とした場合の櫛数は「1010101」となり、
歯の本数が4本、隙間を2本とした場合の櫛数は「1001001001」となり、
歯の本数が4本、隙間を3本とした場合の櫛数は「1000100010001」となります。
また、隙間の数を0本とした場合は、「1111」となり扇数そのものになります。
櫛関数の数式
櫛の歯の本数を\(x\), 歯の隙間の本数を\(s\)とした櫛数を返す関数\(C(x, s)\)を櫛関数と呼ぶ事とします。
櫛関数をシグマ(シグマ)総和の記号を利用して記述すると以下の式となります。
\(C(x, s)= \displaystyle \sum_{k = 0}^{x -1} 10^{k \times (s + 1)}\)櫛関数をPythonで記述した例
def C(x , s = 0): y = 0 for k in range(0, x): y += 10**(k * (s + 1)) return y
関数の仕様
- 関数名:
- C
- 機能:
- 10進数の櫛数の値を返す
- 戻り値:
- 10進数でx個の櫛歯の数を持ち、櫛歯の間隔をs本とした値
- 引数:
-
- x (0以上の整数の値)
- 櫛数に含まれる1の個数
- s (0以上の整数の値)
- 櫛数に含まれる櫛歯の間隔
櫛関数の返す値の例
櫛関数に\(x\)に\(1\)から\(4\)、\(s\)に\(0\)から\(3\)を与えた場合に戻る値の例
\(s = 0\)の場合の例
\(C(1,0) = 1 = A(1)\)\(C(2,0) = 11 = A(2)\)
\(C(3,0) = 111 = A(3)\)
\(C(4,0) = 1111 = A(4)\)
\(s = 1\)の場合の例
\(C(1,1) = 1\)\(C(2,1) = 101\)
\(C(3,1) = 10101\)
\(C(4,1) = 1010101\)
\(s = 2\)の場合の例
\(C(1,2) = 1\)\(C(2,2) = 1001\)
\(C(3,2) = 100100100\)
\(C(4,2) = 1001001001\)
\(s = 3\)の場合の例
\(C(1,3) = 1\)\(C(2,3) = 10001\)
\(C(3,3) = 100010001\)
\(C(4,3) = 1000100010001\)
櫛関数で\(x = 0\)の場合に、\(s\)に\(1\)から\(4\)を与えた場合に戻る値の例
\(C(0, 2) = 0 = A(0)\)
\(C(0, 3) = 0 = A(0)\)
\(C(0, 4) = 0 = A(0)\)
後で、解説しますが、櫛数はものの見方次第(観測者がどの進数として、その数値を観測するのかの違い)で、扇数そのものと言う事もできます。
n進数の櫛関数の数式
\(n\)進数の櫛の歯の本数を\(x\), 歯の隙間の本数を\(s\)とした櫛数を返す関数\(C(x, s, base = n)\)を櫛関数と呼ぶ事とします。
\(n\)進数の櫛関数をシグマ(シグマ)総和の記号を利用して記述すると以下の式となります。
\(C(x, s, base = n)= \displaystyle \sum_{k = 0}^{x -1} n^{k \times (s + 1)}\)n進数の櫛関数をPythonで記述した例
n進数の櫛関数をPythonの関数として記述した例を下記に示します。
def C(x , s = 0, base = 10): y = 0 for k in range(0, x): y += base**(k * (s + 1)) return y
関数の仕様
- 関数名:
- C
- 機能:
- n進数の櫛数の値を返す
- 戻り値:
- n進数でx個の櫛歯の数を持ち、櫛歯の間隔をs本とした値
- 引数:
-
- x (0以上の整数の値)
- 櫛数に含まれる1の個数
- s (0以上の整数の値)
- 櫛数に含まれる櫛歯の間隔
- base = 10 (baseは2以上の整数の値)、省略可能(省略された場合はbase=10)
- n進数の底
櫛数の概念の応用について
2進数の櫛数の概念を利用する事で、LEDの点灯検査パターンなどの、規則性のある検査パターンを数学的に作る事ができます。
櫛数で扱う概念は、扇数、扇階段数、金字塔数にもそのまま応用する事ができるので、この考え方を適用する事で、より桁数の大きなテストパターンの数値を簡単に作る事ができるようになります。
扇数とは?
1, 11, 111, …, 1111111111のように、1の連続だけで表す事ができる数の事を扇数と呼ぶ事にしました
エースの札だけを沢山用意し、扇の様に広げた際に、それぞれの札を、各桁の数値と見立てて得られる値を、ここでは扇数と呼ぶ事にします。
「扇数」は数学的な専門用語では、repunit (repeated unitの省略)で、「レプユニット」、または「レピュニット」と呼ばれ、「単位反復数」とも訳されます。
このページやアンドールシステムサポートのYouTubeちゃんねる、電脳寺子屋 数学を学ぶシリーズの中では、出来るだけ短く表記したいので、「扇数」と呼ぶ事にします。
扇関数を求める計算式
n進数(base = n)のx桁の扇数を返す関数をA(x, base = n)とした場合下記の式で表す事ができます。
\(A(x, base = n)=\displaystyle \sum_{k=0}^{x-1}n^{k}\)
扇関数の特長
扇関数は、引数\(x = 0\)の場合には、全ての進数で0を返します。
\(
A(0, base = n) = 0
\)
扇関数は、引数\(x = 1\)の場合には、全ての進数で1を返します。
\(
A(1, base = n) = 1
\)
扇数を求めるPythonのコード
n進数の扇数を返す扇関数A(x, n)を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進数の底
補足:上記の関数では2番目の仮引数をbase = 10としてるので、2番目の仮引数を省略した場合、A(x) = A(x, 10)となります。
扇関数は等比数列の総和の公式を利用する事でより高速に結果を求める事ができます。詳細についてはこちらのページをご参照ください。
扇数の関連動画
アンドールシステムサポートのYouTubeちゃんねるでは「扇数」を題材とし、組み込みの開発に役立つ解説を行っております。
電脳寺子屋 数学を学ぶ「扇数と再帰関数」扇関数を例に、再帰関数と組み込みにおけるスタック・メモリの影響について説明ます。
電脳寺子屋 数学を学ぶ「扇数とPython」- Pythonのすすめ扇関数をC言語で実装した例と、Pythonで実装した例を通して、C言語に馴染んでいる方向けに、C言語の記述例とPythonの記述例を比較する形で、 Pythonの文法や特長の一部を紹介させて頂きます。
櫛数と扇数の関係
櫛数とは、nのm乗進数の扇数を、n進数から観測して見える数である言う事もできます。
前提知識として、観測者がその数値をどの進数で観測しているのかによって、その数値の見え方は変化します。
Pythonでは、変数xに対し、str(x)で10進数、bin(x)で2進数、oct(x)で8進数、hex(x)で16進数の文字列に変換する事ができます。
下記に、10進数で0から17までの値をそれぞれの進数として観測した場合にどの様に見えるのかを表に示します。
| 変数 | 10進数の文字列 | 2進数の文字列 | 8進数の文字列 | 16進数の文字列 |
|---|---|---|---|---|
| x | str(x) | bin(x) | oct(x) | hex(x) |
| 0 | ‘0‘ | ‘0b0‘ | ‘0o0‘ | ‘0x0‘ |
| 1 | ‘1‘ | ‘0b1‘ | ‘0o1‘ | ‘0x1‘ |
| 2 | ‘2’ | ‘0b10’ | ‘0o2’ | ‘0x2’ |
| 3 | ‘3’ | ‘0b11‘ | ‘0o3’ | ‘0x3’ |
| 4 | ‘4’ | ‘0b100’ | ‘0o4’ | ‘0x4’ |
| 5 | ‘5’ | ‘0b101‘ | ‘0o5’ | ‘0x5’ |
| 6 | ‘6’ | ‘0b110’ | ‘0o6’ | ‘0x6’ |
| 7 | ‘7’ | ‘0b111‘ | ‘0o7’ | ‘0x7’ |
| 8 | ‘8’ | ‘0b1000’ | ‘0o10’ | ‘0x8’ |
| 9 | ‘9’ | ‘0b1001‘ | ‘0o11‘ | ‘0x9’ |
| 10 | ’10’ | ‘0b1010’ | ‘0o12’ | ‘0x0a’ |
| 11 | ‘11‘ | ‘0b1011’ | ‘0o13’ | ‘0x0b’ |
| 12 | ’12’ | ‘0b1100’ | ‘0o14’ | ‘0x0c’ |
| 13 | ’13’ | ‘0b1101’ | ‘0o15’ | ‘0x0d’ |
| 14 | ’14’ | ‘0b1110’ | ‘0o16’ | ‘0x0e’ |
| 15 | ’15’ | ‘0b1111‘ | ‘0o17’ | ‘0x0f’ |
| 16 | ’16’ | ‘0b10000’ | ‘0o20’ | ‘0x10’ |
| 17 | ’17’ | ‘0b10001‘ | ‘0o21’ | ‘0x11‘ |
この表では、扇数となっている部分の数値を強調しています。
0と1は、どの進数で観測しても、同じように見えますが、10進数で2以上の値は、2進数からは別の値として観測されます。
10進数で、7までの値は、8進数と16進数でも同じ値として観測されます。
10進数で、9までの値は、10進数と16進数でも同じ値として観測されます。
10進数で9は、8進数で2桁の扇数であり、2進数として観測した場合は、櫛数となり、歯の本数は2本、歯の隙間の間隔が2本分となります。
10進数で17は、16進数で2桁の扇数であり、2進数として観測した場合は、櫛数となり、歯の本数は2本、歯の隙間の間隔が3本分となります。
8進数とは2の3乗進数(\(8 = 2^3\))、16進数とは2の4乗進数(\(16 = 2^4\))という事ができます。更に、扇数(櫛数)に基数の累乗を掛けた値となている数も強調した表を下記に示します。
| 変数 | 10進数の文字列 | 2進数の文字列 | 8進数の文字列 | 16進数の文字列 |
|---|---|---|---|---|
| x | str(x) | bin(x) | oct(x) | hex(x) |
| 0 | ‘0‘ | ‘0b0‘ | ‘0o0‘ | ‘0x0‘ |
| 1 | ‘1‘ | ‘0b1‘ | ‘0o1‘ | ‘0x1‘ |
| 2 | ‘2’ | ‘0b10‘ | ‘0o2’ | ‘0x2’ |
| 3 | ‘3’ | ‘0b11‘ | ‘0o3’ | ‘0x3’ |
| 4 | ‘4’ | ‘0b100′ | ‘0o4’ | ‘0x4’ |
| 5 | ‘5’ | ‘0b101‘ | ‘0o5’ | ‘0x5’ |
| 6 | ‘6’ | ‘0b110′ | ‘0o6’ | ‘0x6’ |
| 7 | ‘7’ | ‘0b111‘ | ‘0o7’ | ‘0x7’ |
| 8 | ‘8’ | ‘0b1000′ | ‘0o10′ | ‘0x8’ |
| 9 | ‘9’ | ‘0b1001‘ | ‘0o11‘ | ‘0x9’ |
| 10 | ‘10′ | ‘0b1010′ | ‘0o12’ | ‘0x0a’ |
| 11 | ‘11‘ | ‘0b1011’ | ‘0o13’ | ‘0x0b’ |
| 12 | ’12’ | ‘0b1100′ | ‘0o14’ | ‘0x0c’ |
| 13 | ’13’ | ‘0b1101’ | ‘0o15’ | ‘0x0d’ |
| 14 | ’14’ | ‘0b1110′ | ‘0o16’ | ‘0x0e’ |
| 15 | ’15’ | ‘0b1111‘ | ‘0o17’ | ‘0x0f’ |
| 16 | ’16’ | ‘0b10000′ | ‘0o20’ | ‘0x10′ |
| 17 | ’17’ | ‘0b10001‘ | ‘0o21’ | ‘0x11‘ |
扇数どうしの除算と櫛数の関係
n進数の扇数どうしは、桁数が割り切れる値どうしであれば、割り切るとができます。
扇数を扇数で割り切って得られる値は、櫛数となります。
桁数が割り切れる値の扇数で、扇数を割る事で櫛の歯のように 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進数の扇数が櫛数の正体です。
このことは、観測者がその値を10進数として観測する場合、100進数で1桁の値は、10進数上では2桁で1組の値となります。
同様に、1000進数で1桁の値は、10進数上では3桁で1組の値、
10000進数で1桁の値は、10進数上では4桁で1組の値になります。
\(c = A(x, base = n^d)\)
櫛数と扇数の対応の例
\(1010101 = A(4, 10^2) = C(4, 1, 10)\)
櫛歯の本数が4本、櫛歯の隙間が1本の櫛数は、100進数上で4桁の扇数を10進数として観測した値と言えます。
\(10001 = A(2, 10^4) = C(2, 3, 10)\)
櫛歯の本数が2本、櫛歯の隙間が3本の櫛数は、1000進数上で2桁の扇数を10進数として観測した値と言えます。
櫛関数と扇関数の関係についてのまとめ
上記では、扇数の割算から櫛数の関係を見てみました。
次に、櫛数の値を返す櫛関数から扇数の値を返す扇関数の関係を見てみましょう。
xが0以上の整数、sが0以上の整数、nが2以上の整数の場合、
つまり、
\(
x \geqq 0,
s \geqq 0,
n \geqq 2
\)の場合に下記の式が成り立ちます。
\(C(x, s, base = n)\)
\(=A(x \times d, base = n) \div A(d, base = n)\)
\(= A(x, base = n^d)\)
上記の式に\(d = s + 1\)を代入すると下記の式になります。
\(
C(x, s, base = n) = A(x \times (s + 1), base =n) \div A(s + 1, base = n ) = A(x, base = n^{s + 1})
\)
つまり下記の式が成り立ちます。
\(
C(x, s, base = n) = A(x, base = n^{s + 1})
\)
櫛関数の応用
1よりも、大きな値は、観測者がどの進数として観測するかによって、値の見え方が大きく変わります。
m = s + 1とすれば、この事からも、櫛数とは、nのm乗進数の扇数を、n進数から観測して見える数である言う事ができます。
16進数は、2進数で4桁を束ねて、1つの桁として観測した値と言えるように、この考え方を10進数に適用し、10進数で2桁を1つの桁として観測すれば100進数として値を扱う事ができ、3桁を1つの桁として観測すればや1000進数として値を扱う事ができます。
このように、10のm乗進数を、10進数として観測するという概念は、大きな値を扱う際に役立つ場合があります。
n進数の完成・金字塔関数や扇階段数では、引数xが0からn-1の値までの値が与えられた際には、隣り合う桁との値に対し、連続した値になるという性質が保たれますが、
引数xに対して、n以上の値を与えた場合には、桁上りが生じる事によって、この連続性が崩壊します。櫛関数の概念を応用すると、nを10のm乗進数とし、mの値を2以上の値にすることで、連続性が保たれる範囲を拡大する事ができます。
櫛関数の概念を応用すれば、100進数や1000進数、10000進数で値を考える事ができるので、この進数の概念を、完成・金字塔関数や、扇階段関数に応用すれば、連続性が未崩壊の範囲でより大きな桁数の値を扱えるようになります。
10進数で2桁を1組として切り分けて表示する手段がある場合は100進数で、1桁を0~99までの値を1組として見る事ができます。
切り分けて表示する手段が無い場合であっても、1000進数を利用し、0~99までの値を1組として扱えば、扇数、金字塔数、扇数階段数で、桁上りによる連続性が崩壊しない範囲の値としてより多くの桁で構成される値を取り扱うことができるようになります。
完成・金字塔関数への櫛関数の適用
完成・金字塔関数に櫛関数の概念を適用すると、下記の式となります。
\(P(x, base = n^{s + 1}) = A(x, n^{s + 1})^2 = C(x, s, base = n)^2\)
n進数の完成・金字塔関数は、xが0からn-1までの範囲の値であれば、連続性が未崩壊、nを超えると、桁上りが生じる事により、連続性が崩壊します。
つまり、10進数ではxが0から9までの範囲で連続性は未崩壊となるのに対し、100進数であれば、xが0から99までの範囲で、未崩壊となり、
1000進数では、xが0から999までの範囲で未崩壊となります。
x = 9では10進数の場合も連続性が保たれています。
\(P(9,10^{0+1}) = 12345678987654321\)
\(P(9,10^{1+1}) = 102030405060708090807060504030201\)
\(P(9,10^{2+1}) = 1002003004005006007008009008007006005004003002001\)
x = 10では10進数では連続性が崩壊しますが、100進数や1000進数では連続性が保たれています。
\(P(10,10^{0+1}) = 1234567900987654321\)
\(P(10,10^{1+1}) = 1020304050607080910090807060504030201\)
\(P(10,10^{2+1}) = 1002003004005006007008009010009008007006005004003002001\)
x = 11では10進数では連続性が崩壊しますが、100進数や1000進数では連続性が保たれています。
\(P(11,10^{0+1}) = 123456790120987654321\)
\(P(11,10^{1+1}) = 10203040506070809101110090807060504030201\)
\(P(11,10^{2+1}) = 1002003004005006007008009010011010009008007006005004003002001\)
x = 12では10進数では連続性が崩壊しますが、100進数や1000進数では連続性が保たれています。
\(P(12,10^{0+1}) = 12345679012320987654321\)
\(P(12,10^{1+1}) = 102030405060708091011121110090807060504030201\)
\(P(12,10^{2+1}) = 1002003004005006007008009010011012011010009008007006005004003002001\)
扇階段関数への櫛関数の適用
完成・扇階段関数に櫛関数の概念を適用すると、下記の式となります。
\(S(x, base = n^{s + 1})=\displaystyle \sum_{k=1}^{x}A(k, n^{s + 1})\) \(=\displaystyle \sum_{k=1}^{x}C(k, s , base =n)\)

