人类已知的最大质数
上个月,有一个不太引人注目的科学发现:人类已知的最大质数诞生了。
除了数学家,大概没人会对这个消息感兴趣,它离日常生活太远了。
但是,本周《华盛顿邮报》的一篇报道,却把这个发现跟普通人拉近了距离。
大家恐怕想不到,发现这个数字的人不是数学家,而是程序员。《华盛顿邮报》就是讲述背后的精彩故事,我看得津津有味,科学报道就该这么写,下面分享给大家。
====================
2024年10月10日,美国程序员卢克·杜兰特 (Luke Durant) 发现了人类已知的最大质数。
那天晚上,他收拾衣物,准备从加州返回阿拉巴马州的老家。出门之前,他决定远程登录服务器,看一下正在运行的脚本。
他原以为,就像过去一年的每次远程登录一样,脚本要么没有结果,要么报错。但是,那天晚上不一样,脚本给出了运行结果。
杜兰特意识到,他刚刚发现了世界上新的最大质数。他立刻告诉同伴这个消息,然后顾不上回老家了,开始仔细检查脚本的结果。
他发现的这个质数,后来被命名为 M136279841。它大得离谱,足足有41,024,320个十进制位。如果你每秒读一位,需要475天才能读完。这个数字等于2的136,279,841 次方减一。
为了算出这个数字,杜兰特花了差不多一年,自掏腰包大约200万美元,去购买 GPU 计算时间,用来运行脚本。
今年36岁的杜兰特,曾经在 Nvidia 公司担任程序员。公司的股价上涨,让他赚到了足够的钱,于2021年离职,开始投入自己的项目。
他选择的项目,就是计算梅森质数。他在 Nvidia 的经历,让他能够熟练使用 GPU 编程,去完成高速计算。
17世纪,法国传道士马林·梅森(Marin Mersenne)提出,存在无数个质数,可以表示成 2n - 1 的形式,比如3等于22 - 1,7等于23 - 1。
目前,人类已知的梅森质数有52个(包括杜兰特发现的那个)。寻找新的梅森质数,早就成了数学迷的一种爱好。
上个世纪90年代,互联网出现后,一个美国程序员乔治·沃尔特曼(George Woltman)组织了“互联网梅森质数搜索计划”(Great Internet Mersenne Prime Search,简称 GIMPS 计划)。
GIMPS 计划的目的,就是使用计算机程序,寻找梅森质数。它的官网提供程序下载,你可以在自己的电脑上运行这个程序,它会在计算机的空闲时间进行计算,寻找下一个梅森质数。
目前,全世界大约有3,000~5,000名志愿者在运行这个程序。梅森质数实在太难算了,在过去的28年里,GIMPS 计划一共发现了18个梅森质数。
上一个数字发现于2018年,比杜兰特发现的第52个梅森质数短了1600万个十进制位。
杜兰特的不同之处在于,在他以前,所有人都使用 CPU 进行计算,只有他使用 GPU。CPU 一两周的计算量,GPU 大约只需要一两天的时间。
杜兰特为了找到这个数字,动用了17个国家/地区24个机房和两家云服务商的服务器,进行协同计算。
他说:“如今个人的能力比历史上任何时候都强得多,你能调用的云计算,规模令人难以置信。我们拥有这样神奇的强大系统,所以最好弄清楚如何利用它们。”
梅森质数没有任何实际用途,科学家寻找它只是为了乐趣和探索人类知识的边界。
杜兰特由于这个发现,得到了3000美元奖金。他把这些钱捐给了阿拉巴马州的公立寄宿学校,那是他去加州理工学院读大学前的母校。
他发现的最大质数已经到了4100万位,GIMPS 计划依然在悬赏第一个找到十亿位质数的人。
相关文章
C++ 备忘清单
提供基本语法和方法的 C++ 快速参考备忘单
入门
hello.cpp
#include <iostream>
int main() {
std::cout << "Hello Quick Reference\n";
return 0;
}
编译运行
$ g++ hello.cpp -o hello
$ ./hello
Hello Quick Reference
变量
int number = 5; // 整数
float f = 0.95; // 浮点数
double PI = 3.14159; // 浮点数
char yes = 'Y'; // 特点
std::string s = "ME"; // 字符串(文本)
bool isRight = true; // 布尔值
// 常量
const float RATE = 0.8;
int age {25}; // 自 C++11
std::cout << age; // 打印 25
原始数据类型
数据类型 | 大小 | 范围 |
---|---|---|
int |
4 bytes | -231 到 231-1 |
float |
4 bytes | N/A |
double |
8 bytes | N/A |
char |
1 byte | -128 到 127 |
bool |
1 byte | true / false |
void |
N/A | N/A |
wchar_t |
2 到 4 bytes | 1 个宽字符 |
用户输入
int num;
std::cout << "Type a number: ";
std::cin >> num;
std::cout << "You entered " << num;
交换
int a = 5, b = 10;
std::swap(a, b);
// 输出: a=10, b=5
std::cout << "a=" << a << ", b=" << b;
// 整数交换的奇技淫巧
(x ^= y), (y ^= x), (x ^= y);
// 注意! 以下操作会造成 undefined behavior
x ^= y ^= x ^= y;
注释
// C++中的单行注释
/* 这是一个多行注释
在 C++ 中 */
If 语句
if (a == 10) {
// do something
}
查看: 条件
阅读更多Python 3 备忘清单
Python 备忘单是 Python 3 编程语言的单页参考表
入门
介绍
- Python 官方网站 (python.org)
- Python 文档 (docs.python.org)
控制台打印
>>> print("Hello, World!")
Hello, World!
著名的“Hello World”程序在 Python 中的实现
阅读更多