「ファンデルコルプト数列」の版間の差分
表示
削除された内容 追加された内容
編集の要約なし |
|||
32行目: | 32行目: | ||
==C での実装== |
==C での実装== |
||
< |
<syntaxhighlight lang="C"> |
||
double corput(int n, int base){ |
double corput(int n, int base){ |
||
double q=0, bk=(double)1/base; |
double q=0, bk=(double)1/base; |
||
38行目: | 38行目: | ||
return q; |
return q; |
||
} |
} |
||
</syntaxhighlight> |
|||
</source> |
|||
==関連項目== |
==関連項目== |
2020年7月5日 (日) 23:10時点における版
ファンデルコルプト数列(van der Corput sequence)は、単位区間に対する超一様分布列(準乱数列)の1つであり、1935年にオランダの数学者ヨハネ・ファン・デル・コルプトによって考案された。この数列は自然数のn進表記を逆順にしたものを小数点以下に並べたものである。
自然数nのb-進表記は、
であり、k桁目のdkは0 ≤ dk(n) < bを満たす。 このとき、ファンデルコルプト数列のn項目であるgb(n)は
である。
例
例えば、10進のファンデルコルプト数列を得るためには、まず 1 から 9 を10で割ったものを並べる (x/10)。そして、分母を100として、分子に 10 から 99 を並べる。しかしここで、10 からそのまま並べるのではなく、01, 11, 21, 31, 41, 51, 61, 71, 81, 91 ... というように、10の位と1の位を入れ替えて並べる。そして、20以降は分子が2で終わる数字が続き、 02, 12, 22, 32, 42, 52, 62, 72, 82, 92、更に 03, 13, 23 ... と続く。
そのため、ファンデルコルプト数列(10進)は
と続き、小数表記では
- 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.01, 0.11, 0.21, 0.31, 0.41, 0.51, 0.61, 0.71, 0.81, 0.91, 0.02, 0.12, 0.22, 0.32, …
となる。
2進法でも同様であり、2進ファンデルコルプト数列は
または
- 0.12, 0.012, 0.112, 0.0012, 0.1012, 0.0112, 0.1112, 0.00012, 0.10012, 0.01012, 0.11012, 0.00112, 0.10112, 0.01112, 0.11112, …
と続く。
任意の底において、ファンデルコルプト数列は単位区間での稠密集合となる。つまり、[0, 1]内の任意の実数に対して、その実数に収束するファンデルコルプト数列の部分列が存在する。また、単位区間で一様である。
C での実装
double corput(int n, int base){
double q=0, bk=(double)1/base;
while(n>0) { q += (n % base)*bk; n /= base; bk /= base; }
return q;
}
関連項目
参考文献
- van der Corput, J.G. (1935), “Verteilungsfunktionen (Erste Mitteilung)” (German), Proceedings of the Koninklijke Akademie van Wetenschappen te Amsterdam 38: 813–821, Zbl 0012.34705
- Kuipers, L.; Niederreiter, H. (2005) [1974], Uniform distribution of sequences, Dover Publications, p. 129,158, ISBN 0-486-45019-8, Zbl 0281.10001