人类已知的最大质数

上个月,有一个不太引人注目的科学发现:人类已知的最大质数诞生了。

除了数学家,大概没人会对这个消息感兴趣,它离日常生活太远了。

但是,本周《华盛顿邮报》的一篇报道,却把这个发现跟普通人拉近了距离。

大家恐怕想不到,发现这个数字的人不是数学家,而是程序员。《华盛顿邮报》就是讲述背后的精彩故事,我看得津津有味,科学报道就该这么写,下面分享给大家。

====================

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 编程语言的单页参考表

入门

介绍
控制台打印
>>> print("Hello, World!")
Hello, World!

著名的“Hello World”程序在 Python 中的实现

阅读更多
<

树莓派掌上电脑

一支国外团队推出了“树莓派掌上电脑”,看上去很酷。

它就是一个全功能的 Linux 系统,带有7小时续航。

它还有一个可组装版本,屏幕是单独分离的。

下面可以配上键盘,也可以配上手柄。

它是开源的,制作团队希望将成本控制在250美元。

阅读更多