モーザー・ド・ブリュイン数列を瞬時に生成。0と1のみを使用した4進数表現で、異なる4の累乗の和を計算。数学教育と研究のための無料オンラインツール。
モーザー・ド・ブリュイン数列は、4の異なる累乗の和として表現できる数字を含む数列です
モーザー・ド・ブルイン数列は、4の異なる累乗の和として表現できる数字で構成される数列です。数学者レオ・モーザーとニコラース・ゴヴェルト・ド・ブルインにちなんで名付けられたこの数列は、次のように始まります:0, 1, 4, 5, 16, 17, 20, 21, 64, 65, 68, 69, 80, 81, 84, 85...
この数列の興味深い点は何でしょうか?任意の項を4進数で書くと、2や3ではなく、0と1のみが見られます。つまり、各数は4の累乗(4⁰, 4¹, 4², 4³など)を加算して構築され、各累乗は1回だけ、または全く使用されません。
実践的な例を挙げましょう:数字21は、16 + 4 + 1、つまり4² + 4¹ + 4⁰に等しいため、数列に含まれます。4進数では、これは「111」と書かれ、0と1のみで表現されます。対照的に、22は4進数表現に「2」が必要(122)なので、数列に含まれません。
この数列は、加法的数論、組み合わせ論、和集合に関する研究に現れます。2の累乗ではなく4の累乗を扱う二進法の「いとこ」のようなものと考えてください。これにより、ほとんどの整数が除外される、はるかにまばらな数列が生成されます。
このジェネレーターの使用は簡単です:
計算はすべてブラウザ内のJavaScriptで実行されるため、サーバーの遅延やインターネット接続に依存せず、高速でオフラインでも動作します。
ジェネレーターは以下のように入力を検証してエラーを防ぎます:
なぜ1000項の制限があるのか?アルゴリズムは効率的ですが、何千もの項を生成するとブラウザのメモリ、特にモバイルデバイスで負荷がかかります。実際には、ほとんどの数学的分析や教育目的では100〜200項で十分です。
モーザー・ド・ブルイン数列は、3つの等価な方法で定義できます。それぞれが異なる洞察を提供します:
加法形式(4の累乗): 数 n は、以下の条件を満たす場合に数列に属します: ここで、S は任意の非負整数の集合です。各4の累乗は1回だけ使用できます—繰り返しは許可されません。
4進数表現(最も簡単なテスト): 数を4進数に変換します。0と1のみが見える場合(2や3がない)、その数は数列に属します。これは手作業で所属を確認する最も速い方法です。
バイナリ対応(計算に最も有用): n番目の項(n=0から開始)を見つけるには: ここで、 は n のバイナリ桁です。つまり:インデックスのバイナリ表現を取得し、各「1」ビットを対応する4の累乗に置き換えます。
これらの定義がどのように機能するかを見てみましょう:
バイナリ対応の方法は、このジェネレーターの内部で使用されています—ビット単位の演算が高速であるため、計算効率が高いです。
ジェネレーターは高速でシンプルであるため、バイナリ対応を使用します:
ステップバイステップのプロセス:
実例:6番目の項(インデックス5)の計算
M(5)を段階的に計算してみましょう:
この方法は拡張性が高い。大きなインデックスでは、本質的にビットシフトと加算を行っており、最新のプロセッサでは非常に高速に処理されます。
特定の数が、モーザー・ド・ブルイン数列に含まれるかどうかを確認したい場合は、4進数テストを使用します:
例: 85は数列に含まれるか?
反例: 90は数列に含まれるか?
ジェネレーターは、最新のブラウザで高度に最適化されているJavaScriptのビット演算子を使用して、これを実装しています。
モーザー・ド・ブルイン数列は純粋な整数を扱います:
この指数関数的な成長により、数列は急速に大きくなります。20番目の項はすでに340であり、100番目の項では数百万の数字を扱うことになります。
数値システムの教育: 教室で使用した際、学生はモーザー・ド・ブルイン系列で遊ぶことで、ベース変換をより速く理解できます。これはバイナリ(基数2)とより複雑な数値システムの間のギャップを埋めます。学生は、ベースを変更することで系列の密度がどのように変化するかを即座に理解できます。
ビット演算の理解: コンピュータサイエンスの学生は、バイナリ表現と数学的系列の直接的な関係を見ることで恩恵を受けます。このアルゴリズムは、ビット操作が抽象的な操作だけでなく、実際の数学的オブジェクトにどのように変換されるかを示しています。
組み合わせ論と和集合: 加法的基底を研究する研究者は、このような系列を使用して、一意の表現を可能にする集合を探求します。モーザー・ド・ブルイン系列は、表現可能な数値が正確に1つの表現を持つ集合の教科書的な例です。
加法的数論: この系列は、整数がどのように和に分解できるかという問題を調査するのに役立ちます。整数列オンライン百科事典(OEIS)でA000695として分類されています。
アルゴリズム設計: 生成アルゴリズムは、効率的な系列構築を示しています。最小の計算オーバーヘッドで数千の項を生成でき、アルゴリズムのベンチマークや効率的なコードパターンの教育に役立ちます。
パターン認識タスク: スパースな整数集合やデータ圧縮スキームを扱う際、モーザー・ド・ブルイン系列のような系列の動作を理解することは、エンコーディング戦略に関する設計上の意思決定に役立ちます。
モーザー・ド・ブリュイン数列に興味がある場合、これらの関連する数列は異なる基数や制約を持つ類似のパターンを提供します:
2のべき乗(OEIS A000079): 1, 2, 4, 8, 16, 32... 最も単純な加法的基数。2のべき乗が1回だけ現れ、バイナリ数の構成要素を形成します。
すべての非負整数(バイナリ和): 0, 1, 2, 3, 4, 5, 6, 7... 異なる2のべき乗の和を許可すると、可能なすべての整数が得られます。これがバイナリ表現の仕組みです。
異なる3のべき乗の和(OEIS A005836): 0, 1, 3, 4, 9, 10, 12, 13... モーザー・ド・ブリュイン数列と同じ概念ですが、4ではなく3のべき乗を使用します。これらは、3進数表現に0と1のみが含まれる数字です。
フィバイナリ数(OEIS A003714): 0, 1, 2, 4, 5, 8, 9, 10... バイナリ形式に連続する1が含まれない数。フィボナッチ数システムとゼッケンドルフの定理に関連しています。
スタンレー数列: モーザー・ド・ブリュイン数列の3進数類似—3進数表現に1が含まれない数(0と2のみ許可)。
整数列オンライン百科事典(OEIS)は、何十万もの数列をカタログ化しています。「加法的基数」、「和を含まない集合」、「異なるべき乗」などの用語で検索すると、関連する数列が見つかります。モーザー・ド・ブリュイン数列自体はOEISデータベースのA000695です。
レオ・モーザー(1921-1970)とニコラース・ゴヴェルト・デ・ブルイン(1918-2012)は、異なる背景を持ちながら、数学に永続的な貢献をした。モーザーは、オーストリア系カナダ人の数学者で、数論、組み合わせ論、幾何学に広範囲に取り組み、エルデシュ–モーザー方程式で知られている。デ・ブルインは、オランダの数学者で、組み合わせ論、グラフ理論、計算機科学に大きな影響を与えた。彼のデ・ブルイン列(この列とは異なる)は、符号理論において基本的であり、今日でも広く使用されている。
彼らの名を冠した数列は、1960年代に加法的数論の研究中に生まれた。数学者たちは次のような問いを追求していた:どの整数の集合が他の整数を和として一意に表現できるのか?4の累乗がそのような集合の1つであることが判明し、モーザー–デ・ブルイン数列は作ることができるすべての可能な和を捉えている。
この数列は、加法的基底の広範な研究の中に位置している—他の整数を加法によって構築できる整数の集合。一部の基底は一意の表現を可能にし(4の累乗のように)、他の基底はそうではない。どの基底がどのような性質を持つかを理解することは、加法的数論における活発な研究分野のままである。
この数列はOEIS A000695で見つけることができ、数学者たちは2進表現、4進(基数4)システム、組み合わせ論的性質との関連を文書化している。現代の計算機科学は、特にビット操作とスパースデータ構造の効率的なエンコーディングに関するアルゴリズムにおいて、新たな用途を見出している。
モーザー・ド・ブルイン数列ジェネレーターを自分で実装したいですか?ここでは、人気のプログラミング言語での効率的な実装例を紹介します。各例には、数列ジェネレーターとメンバーシップテスト関数の両方が含まれています。
1def moser_de_bruijn(n):
2 """モーザー・ド・ブルイン数列の最初のn項を生成する。"""
3 sequence = []
4 for i in range(n):
5 term = 0
6 power = 1
7 temp = i
8 while temp > 0:
9 if temp & 1: # 最下位ビットが1かどうかをチェック
10 term += power
11 power *= 4
12 temp >>= 1 # 次のビットをチェックするために右シフト
13 sequence.append(term)
14 return sequence
15
16# 使用例:
17terms = moser_de_bruijn(20)
18print("モーザー・ド・ブルイン数列の最初の20項:")
19print(terms)
20# 出力: [0, 1, 4, 5, 16, 17, 20, 21, 64, 65, 68, 69, 80, 81, 84, 85, 256, 257, 260, 261]
21
22def is_moser_de_bruijn(num):
23 """数字がモーザー・ド・ブルイン数列に含まれるかをチェックする。"""
24 while num > 0:
25 digit = num % 4
26 if digit > 1:
27 return False
28 num //= 4
29 return True
30
31# 21が数列に含まれるかをチェック
32print(f"21は数列に含まれますか? {is_moser_de_bruijn(21)}") # True
33print(f"22は数列に含まれますか? {is_moser_de_bruijn(22)}") # False
341function moserDeBruijn(n) {
2 const sequence = [];
3 for (let i = 0; i < n; i++) {
4 let term = 0;
5 let power = 1;
6 let temp = i;
7 while (temp > 0) {
8 if (temp & 1) { // 最下位ビットが1かどうかをチェック
9 term += power;
10 }
11 power *= 4;
12 temp >>= 1; // 次のビットをチェックするために右シフト
13 }
14 sequence.push(term);
15 }
16 return sequence;
17}
18
19// 使用例:
20const terms = moserDeBruijn(20);
21console.log("モーザー・ド・ブルイン数列の最初の20項:");
22console.log(terms);
23// 出力: [0, 1, 4, 5, 16, 17, 20, 21, 64, 65, 68, 69, 80, 81, 84, 85, 256, 257, 260, 261]
24
25function isMoserDeBruijn(num) {
26 while (num > 0) {
27 const digit = num % 4;
28 if (digit > 1) {
29 return false;
30 }
31 num = Math.floor(num / 4);
32 }
33 return true;
34}
35
36// 特定の数字をチェック
37console.log(`21は数列に含まれますか? ${isMoserDeBruijn(21)}`); // true
38console.log(`22は数列に含まれますか? ${isMoserDeBruijn(22)}`); // false
391import java.util.ArrayList;
2import java.util.List;
3
4public class MoserDeBruijnGenerator {
5
6 public static List<Integer> generateSequence(int n) {
7 List<Integer> sequence = new ArrayList<>();
8 for (int i = 0; i < n; i++) {
9 int term = 0;
10 int power = 1;
11 int temp = i;
12 while (temp > 0) {
13 if ((temp & 1) == 1) { // 最下位ビットが1かどうかをチェック
14 term += power;
15 }
16 power *= 4;
17 temp >>= 1; // 次のビットをチェックするために右シフト
18 }
19 sequence.add(term);
20 }
21 return sequence;
22 }
23
24 public static boolean isMoserDeBruijn(int num) {
25 while (num > 0) {
26 int digit = num % 4;
27 if (digit > 1) {
28 return false;
29 }
30 num /= 4;
31 }
32 return true;
33 }
34
35 public static void main(String[] args) {
36 List<Integer> terms = generateSequence(20);
37 System.out.println("モーザー・ド・ブルイン数列の最初の20項:");
38 System.out.println(terms);
39
40 System.out.println("21は数列に含まれますか? " + isMoserDeBruijn(21)); // true
41 System.out.println("22は数列に含まれますか? " + isMoserDeBruijn(22)); // false
42 }
43}
441#include <iostream>
2#include <vector>
3
4std::vector<int> moserDeBruijn(int n) {
5 std::vector<int> sequence;
6 for (int i = 0; i < n; i++) {
7 int term = 0;
8 int power = 1;
9 int temp = i;
10 while (temp > 0) {
11 if (temp & 1) { // 最下位ビットが1かどうかをチェック
12 term += power;
13 }
14 power *= 4;
15 temp >>= 1; // 次のビットをチェックするために右シフト
16 }
17 sequence.push_back(term);
18 }
19 return sequence;
20}
21
22bool isMoserDeBruijn(int num) {
23 while (num > 0) {
24 int digit = num % 4;
25 if (digit > 1) {
26 return false;
27 }
28 num /= 4;
29 }
30 return true;
31}
32
33int main() {
34 std::vector<int> terms = moserDeBruijn(20);
35 std::cout << "モーザー・ド・ブルイン数列の最初の20項:" << std::endl;
36 for (int term : terms) {
37 std::cout << term << " ";
38 }
39 std::cout << std::endl;
40
41 std::cout << "21は数列に含まれますか? " << (isMoserDeBruijn(21) ? "true" : "false") << std::endl;
42 std::cout << "22は数列に含まれますか? " << (isMoserDeBruijn(22) ? "true" : "false") << std::endl;
43
44 return 0;
45}
46これらの実装はすべて同じパターンに従っています:インデックスのバイナリ表現を読み取るためにビット演算を使用し、4の累乗の和に対応する項を構築します。メンバーシップテスト関数は、基数4のアプローチを使用して、数字が0と1に制限されているかをチェックします。
性能面では、これらの実装は非常に効率的です。n項を生成する時間計算量はO(n × log n)で、各項は O(log i) ビットを調べる必要があります。単一の数字のメンバーシップをチェックする計算量は、テストされる数字をNとしてO(log N)です。
以下の表は、最初の32項目の完全な内訳を示しています。ベース4表現が0と1のみで構成されており、分解が直接バイナリインデックスにマッピングされていることに注目してください:
| インデックス | 項 | 分解 | ベース4 |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 1 | 1 | 4⁰ | 1 |
| 2 | 4 | 4¹ | 10 |
| 3 | 5 | 4¹ + 4⁰ | 11 |
| 4 | 16 | 4² | 100 |
| 5 | 17 | 4² + 4⁰ | 101 |
| 6 | 20 | 4² + 4¹ | 110 |
| 7 | 21 | 4² + 4¹ + 4⁰ | 111 |
| 8 | 64 | 4³ | 1000 |
| 9 | 65 | 4³ + 4⁰ | 1001 |
| 10 | 68 | 4³ + 4¹ | 1010 |
| 11 | 69 | 4³ + 4¹ + 4⁰ | 1011 |
| 12 | 80 | 4³ + 4² | 1100 |
| 13 | 81 | 4³ + 4² + 4⁰ | 1101 |
| 14 | 84 | 4³ + 4² + 4¹ | 1110 |
| 15 | 85 | 4³ + 4² + 4¹ + 4⁰ | 1111 |
| 16 | 256 | 4⁴ | 10000 |
| 17 | 257 | 4⁴ + 4⁰ | 10001 |
| 18 | 260 | 4⁴ + 4¹ | 10010 |
| 19 | 261 | 4⁴ + 4¹ + 4⁰ | 10011 |
| 20 | 272 | 4⁴ + 4² | 10100 |
| 21 | 273 | 4⁴ + 4² + 4⁰ | 10101 |
| 22 | 276 | 4⁴ + 4² + 4¹ | 10110 |
| 23 | 277 | 4⁴ + 4² + 4¹ + 4⁰ | 10111 |
| 24 | 320 | 4⁴ + 4³ | 11000 |
| 25 | 321 | 4⁴ + 4³ + 4⁰ | 11001 |
| 26 | 324 | 4⁴ + 4³ + 4¹ | 11010 |
| 27 | 325 | 4⁴ + 4³ + 4¹ + 4⁰ | 11011 |
| 28 | 336 | 4⁴ + 4³ + 4² | 11100 |
| 29 | 337 | 4⁴ + 4³ + 4² + 4⁰ | 11101 |
| 30 | 340 | 4⁴ + 4³ + 4² + 4¹ | 11110 |
| 31 | 341 | 4⁴ + 4³ + 4² + 4¹ + 4⁰ | 11111 |
項21を完全に分解してみましょう:
パターンが見えますか?バイナリインデックス(111)が直接4のどの累乗を含めるかをマッピングしています。各「1」ビットが、その累乗を含めることを示しています。
このシーケンスは指数関数的に成長します。n番目の項は、おおよそ4^(log₂(n))に比例します。これは実際にどういう意味でしょうか?
数が大きくなるにつれ、このシーケンスはますます疎になります。より多くの整数をスキップしていきます。しかし、この疎らさにもかかわらず、このシーケンスは無限に多くの項を持ち、成長し続けます。
OEIS A000695 - モーザー・ド・ブリュイン数列。整数列のオンライン百科事典。数列の包括的なデータと特性。
ド・ブリュイン, N. G. 「整数集合の基底について」『数学論文集デブレツェン』、第1巻、1950年、232-242ページ。加法的基底の主要な特性を確立した基本論文。
モーザー, レオ. 「生成級数の応用」『数学雑誌』、第35巻、第1号、1962年、37-38ページ。数列の生成関数を探求した初期の研究。
ストラルスキー, ケネス B. 「二項係数の偶奇性に関連するデジタル和のべき乗と指数和」『応用数学ジャーナル』、第32巻、第4号、1977年、717-730ページ。モーザー・ド・ブリュイン数列に関連するデジタル和の特性を探求。
アルーシュ, ジャン=ポール、およびジェフリー・シャリット. 『自動数列:理論、応用、一般化』ケンブリッジ大学出版、2003年。モーザー・ド・ブリュイン数列を含む自動数列に関する章。
この列は、加法的基底の研究、和集合に関する組み合わせ論、ビット演算と効率的なアルゴリズムを教えるためのコンピュータサイエンス教育、数学的パターン分析など、いくつかの応用があります。また、異なる数値基底の関係を理解するための優れた教育ツールでもあります。
0から始めるインデックスnを取り、それをバイナリに変換し、各「1」ビットを対応する4の累乗に置き換えます。例えば、インデックス5のバイナリ表現は101なので、4² + 4⁰ = 16 + 1 = 17を計算します。これが(インデックス0から数えて)5番目の項になります。
列内の各数字は、その4進表現に0と1のみが含まれ、2や3は決して含まれないという特徴的な性質を持っています。つまり、各項は、各累乗が最大1回だけ出現する4の累乗を加えることで構築できます。これはバイナリに似ていますが、2の累乗ではなく4の累乗を使用しています。
数字を4進数に変換し、その桁を見てください。0と1のみが見られる場合、その数字は列に含まれます。2または3がある場合は含まれません。例えば、21の4進数は111(すべて1と0)なので、含まれます。しかし、22の4進数は112(2を含む)なので、含まれません。
n番目の項M(n)は、次の公式に従います:M(n) = Σ(b_i × 4^i)。ここで、b_iはnのバイナリ桁を表します。平易な言葉で言えば:nをバイナリで書き、1がある各位置について対応する4の累乗を加算します。
はい、永遠に続きます。モーザー・ド・ブルイン列には無限の項があります。ただし、数値が大きくなるにつれて、列はますます疎になり、列のメンバー間の通常の整数をより多くスキップするようになります。
バイナリ列(2の累乗の和)は、すべての非負整数を表現できます。これがバイナリ表現の機能です。モーザー・ド・ブルイン列は代わりに4の累乗を使用し、はるかに疎な集合を作成します。ほとんどの整数はモーザー・ド・ブルイン列に現れません。
レオ・モーザー(1921-1970)、オーストリア系カナダ人数学者と、ニコラース・ゴヴェルト・ド・ブルイン(1918-2012)、オランダ人数学者の両氏が、1960年代に加法的数論の研究の一環としてこの列を深く研究しました。この列は両氏の名前を冠しています。
このジェネレーターは完全にブラウザ上で動作し、インストール、登録、待ち時間は一切ありません。数系を学ぶ学生、加法的基底を探求する研究者、または単に数学に興味のある方であれば、すぐにタームを生成し、パターンを自分で確認できます。さまざまな数量を生成して、シーケンスがどのように成長し、どの整数が含まれるかを観察してみてください。
ワークフローに役立つかもしれないさらなるツールを発見する