即时生成莫泽-德布鲁因序列。使用仅包含0和1的4进制表示计算不同4的幂的和。用于数学教育和研究的免费在线工具。
莫泽-德布鲁因序列包含可以写成4的不同幂的和的数字
莫泽-德布鲁因序列由可以表示为4的不同幂的和的数字组成。以数学家利奥·莫泽和尼古拉斯·戈弗特·德布鲁因的名字命名,该序列从0, 1, 4, 5, 16, 17, 20, 21, 64, 65, 68, 69, 80, 81, 84, 85...开始。
这个序列有什么有趣之处?当你用4进制写出任何项时,你只会看到0和1这两个数字——永远不会出现2或3。这意味着每个数字都是通过添加4的幂(如4⁰, 4¹, 4², 4³)构建的,每个幂要么出现一次,要么根本不出现。
这里有一个实际的例子:数字21出现在序列中,因为它等于16 + 4 + 1,即4² + 4¹ + 4⁰。在4进制中,这写作"111"——只有0和1。相比之下,22需要在其4进制表示中使用"2"(122),所以它不符合条件。
该序列出现在加法数论、组合学和关于无和集的研究中。可以将其视为二进制系统的4进制表亲——不是使用2的幂,而是使用4的幂。这造成了一个更稀疏的序列,因为大多数整数都被跳过了。
使用这个生成器非常简单:
计算完全在您的浏览器中使用JavaScript运行,因此没有服务器延迟或互联网依赖——它快速且一旦页面加载就可以离线工作。
生成器会验证您的输入以防止错误:
为什么限制1000个项?虽然算法高效,但生成数千个项可能会占用浏览器内存,尤其是在移动设备上。实际上,对于大多数数学分析或教育目的,您很少需要超过100-200个项。
你可以通过三种等效的方式定义莫泽-德布鲁因序列,每种方式都提供不同的洞察:
加法形式(4的幂): 当你可以写成以下形式时,数字n属于该序列: 其中S是任意非负整数集合。每个4的幂可以出现一次或不出现——不允许重复。
四进制表示(最简单的测试): 将数字转换为四进制。如果只看到0和1(没有2或3),则它在序列中。这是手动检查成员资格最快的方法。
二进制对应(计算最有用): 要找到第n项(从n=0开始): 其中是n的二进制数字。翻译:取索引的二进制表示,然后将每个"1"位替换为对应的4的幂。
让我们看看这些定义是如何运作的:
二进制对应方法是这个生成器在底层使用的方法——它在计算上是高效的,因为位操作很快。
生成器使用二进制对应,因为它快速且直接:
逐步过程:
实例:求第6项(索引5)
让我们逐步计算M(5):
这种方法扩展性很好。对于大索引,本质上是进行位移和加法运算——这是现代处理器极其快速处理的操作。
想要检查特定数字是否在莫泽-德布鲁因序列中?使用4进制测试:
示例: 85是否在序列中?
反例: 90是否在序列中?
生成器使用JavaScript的位运算符实现,这些运算符是语言原生的,在现代浏览器中高度优化。
莫泽-德布鲁因序列处理纯整数:
这种指数级增长意味着序列快速变大。第20项已经是340,到第100项时,你将处理数百万级的数字。
教授数字系统: 在课堂上使用这个序列时,学生通过操作莫泽-德布鲁因序列可以更快地理解进制转换。它架起了二进制(基数2)和更复杂数字系统之间的桥梁。学生可以立即看出改变进制如何改变序列的密度。
理解位运算: 计算机科学学生可以从二进制表示和数学序列之间的直接联系中受益。该算法展示了位操作如何转化为真实的数学对象,而不仅仅是抽象的运算。
组合学和无和集: 研究加法基的研究者使用这样的序列来探索哪些集合允许唯一表示。莫泽-德布鲁因序列是一个典型的例子,其中每个可表示的数字都有且仅有一个表示。
加法数论: 该序列有助于研究整数如何被分解为和的问题。它与整数序列在线百科全书(OEIS)中编号为A000695的问题相关。
算法设计: 生成算法展示了高效的序列构建方法。你可以用最小的计算开销生成数千个项,这使其对算法基准测试或教授高效代码模式很有用。
模式识别任务: 在处理稀疏整数集或数据压缩方案时,了解莫泽-德布鲁因这样的序列的行为有助于为编码策略做出设计决策。
如果莫泽-德布鲁因序列引起了你的兴趣,这些相关序列提供了具有不同基数或约束的类似模式:
2的幂(OEIS A000079): 1, 2, 4, 8, 16, 32... 最简单的加法基数。每个2的幂恰好出现一次,形成二进制数的基本构建块。
所有非负整数(二进制和): 0, 1, 2, 3, 4, 5, 6, 7... 当你允许任何不同2的幂的和时,你会得到每个可能的整数——这就是二进制表示的作用。
不同3的幂的和(OEIS A005836): 0, 1, 3, 4, 9, 10, 12, 13... 与莫泽-德布鲁因序列概念相同,但使用3的幂而不是4的幂。这些是其三进制表示仅包含0和1的数字。
斐波那契二进制数(OEIS A003714): 0, 1, 2, 4, 5, 8, 9, 10... 其二进制形式没有连续1的数字。与斐波那契数系统和泽肯多夫定理相关。
斯坦利序列: 莫泽-德布鲁因序列的三进制类比——其三进制表示中没有1(只允许0和2)的数字。
整数序列在线百科全书(OEIS)收录了数十万个序列。搜索"加法基数"、"无和集"或"不同幂"等术语,可以找到相关序列。莫泽-德布鲁因序列本身在OEIS数据库中是A000695。
利奥·莫泽(Leo Moser,1921-1970)和尼古拉斯·戈弗特·德布鲁因(Nicolaas Govert de Bruijn,1918-2012)都对数学做出了持久的贡献,尽管他们来自不同的背景。莫泽是一位奥地利-加拿大数学家,在数论、组合数学和几何学方面工作广泛,你可能从埃尔多斯-莫泽方程中认识他的名字。德布鲁因是一位荷兰数学家,在组合数学、图论和计算机科学领域留下了深刻的印记。他的德布鲁因序列(与此序列不同)在编码理论中是基础性的,至今仍被广泛使用。
他们的同名序列产生于1960年代,当时正在研究加法数论。数学家们在探索:哪些整数集合可以唯一地表示其他整数的和?4的幂证明是这样一个集合,而莫泽-德布鲁因序列捕捉了所有可能的和。
该序列位于加法基础的更广泛研究中——通过加法可以构建其他整数的整数集合。某些基础允许唯一表示(如4的幂),而其他则不然。理解哪些基础具有哪些特性仍然是加法数论中的活跃研究领域。
你可以在OEIS的A000695中找到这个序列,数学家们已记录了它与二进制表示、四进制(基数-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)}") # 真
33print(f"22是否在序列中?{is_moser_de_bruijn(22)}") # 假
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)}`); // 真
38console.log(`22是否在序列中?${isMoserDeBruijn(22)}`); // 假
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)); // 真
41 System.out.println("22是否在序列中?" + isMoserDeBruijn(22)); // 假
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) ? "真" : "假") << std::endl;
42 std::cout << "22是否在序列中?" << (isMoserDeBruijn(22) ? "真" : "假") << std::endl;
43
44 return 0;
45}
46所有这些实现遵循相同的模式:使用位运算读取索引的二进制表示,然后构造相应的4的幂的和。成员资格测试函数使用基于4的方法——检查数字是否仅限于0和1。
从性能角度来看,这些实现非常高效。生成n项的时间复杂度为O(n × log n),因为每一项需要检查O(log i)个位。对于单个数字的成员资格检查,时间复杂度为O(log N),其中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。这就是第5项(从索引0开始计数)。
序列中的每个数字都有一个独特的特性:其4进制表示仅包含0和1,从不出现2或3。这意味着你可以通过添加4的幂来构建每一项,每个幂最多出现一次。这就像二进制,但使用4的幂而不是2的幂。
将数字转换为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年代深入研究这个序列,作为加法数论研究的一部分。该序列以他们两人的名字命名。
这个生成器完全在您的浏览器中运行——无需安装、无需注册、无需等待。无论您是正在学习数字系统的学生、探索加法基数的研究者,还是对数学充满好奇的人,您都可以立即生成项并亲自观察模式。尝试生成不同数量的项,观察序列如何增长以及包含哪些整数。
发现更多可能对您的工作流程有用的工具