Daniel Lemire 及其博客介绍
Daniel Lemire 是一位软件性能专家,在全球科学家排名中位居前 2%(斯坦福大学/爱思唯尔 2025 年排名),也是 GitHub 上最受关注的前 1000 名开发者之一。他于 2004 年创办了这个博客,目前已有 2370 篇文章和 16294 条审核通过的评论,其博客在领先的科技新闻聚合平台 Hacker News 上,跻身最受欢迎的前 50 名博客之列。
他的主页是 https://lemire.me/en/ ,GitHub 个人资料是 https://github.com/lemire 。若企业需要帮助,可联系他,他提供私人讲座、培训、咨询服务,也承接赞助的开源项目(https://lemire.me/en/?v=1#consulting )。他不接受任何广告,但可在 GitHub 上赞助他的开源工作(https://github.com/sponsors/lemire )。
还可加入超过 12500 名邮件订阅者的行列,在 GitHub 上关注他,在 X 上关注他(https://x.com/intent/follow?screen_name=lemire&show_count=true&size=large ,超过 30000 名粉丝),也能在 Telegram(https://t.me/dlemire )上关注本博客。
近期文章与评论
近期文章有:具身认知与能动 AI(https://lemire.me/blog/2026/05/28/embodied-cognition-and-agentic-ai/ )、利用 AVX - 512 超快速解析 IPv6 地址(https://lemire.me/blog/2026/05/23/parsing-ipv6-addresses-crazily-fast-with-avx-512/ )等。
近期评论有:Nik 在所有 64 位整数中,只有 17% 是两个 32 位整数的乘积(https://lemire.me/blog/2026/05/22/only-17-of-all-64-bit-integers-are-products-of-two-32-bit-integers/#comment-677782 )下的评论等。
页面与存档信息
页面包括技术简史(https://lemire.me/blog/a-short-history-of-technology/ )、关于我(https://lemire.me/blog/about-me/ )等。
存档信息展示了从 2004 年 1 月到 2026 年 5 月各月的文章数量,如 2026 年 5 月有 6 篇,2026 年 4 月有 5 篇等。
其他信息
其他信息有登录(https://lemire.me/blog/wp-login.php )、文章订阅源(https://lemire.me/blog/feed/ )等。
64 位整数乘积问题探讨
在软件开发中,两个整数相乘结果以固定位数存储可能溢出,如 8 位整数 127 乘以 127,以 8 位无符号整数存储结果为 1,实际完整乘积 16129 需 16 位表示,由此引出“完整乘积”概念,两个 32 位整数的完整乘积通常用 64 位表示。
一直思考的问题是:所有 64 位整数中,有多大比例可表示为两个 32 位整数的乘积?关注此问题的原因在于,常设计哈希函数,几年前设计的超快速哈希函数 clhash(https://github.com/simdhash/clhash )采用常用于加密应用的乘法方式,试图证明其比基于标准乘法的技术更具优势。
以一个简单的 32 位整数哈希函数为例,它将整数的高 16 位与低 16 位相乘,但该哈希函数无法产生所有 32 位哈希值,因为伟大的数学家 Erdös 证明,当 `n` 足够大时,所有 `2n` 位数值中,能由两个 `n` 位数值相乘得到的比例趋近于零。
对于 16 位整数相乘得到 32 位乘积的情况,可通过暴力枚举解决,约五分之一的 32 位数字是两个 16 位整数的乘积,约 80% 的 32 位整数无法通过这种方式得到,但暴力枚举无法扩展到 32 位情况。
对于 32 位整数相乘得到 64 位乘积的情况,通过函数 simpleHighLowHash 产生的 64 位值占所有 64 位值的比例可精确计算。Webster(https://blue.butler.edu/~jewebste/ )及其同事建立了相关数学理论(https://arxiv.org/pdf/1908.04251 ),他还公开了代码(https://github.com/jewebste/multiplication-table-problem )。经计算,有 3215709724700470902 个 64 位(无符号)整数可以表示为两个 32 位整数的乘积,约占所有可能值的 17%。
寻找相乘因数的方法
若已知一个 64 位整数,找出相乘得到它的两个 32 位整数的一种方法是,先对该整数进行完整的质因数分解,然后利用这些质因数构建所有小于 `2^32` 的可能因数。从只包含 `1` 的候选集开始,不断将现有候选数与每个质因数相乘(只保留小于 `2^32` 的乘积),处理具有重数的唯一质因数,最后选择最大的候选数 `m` 作为小于 `2^32` 的最大因数,计算相应的余数 `n / m`,并判断是否能将该数拆分为两个 32 位因数。一般来说,答案(如果存在)不是唯一的,这种方法返回的是其中一个值最大的因数对。还给出了用 Python 实现的代码示例。
有趣的是,如果随机选择一个 64 位整数,它通常无法表示为两个 32 位整数的乘积。
作者信息
Daniel Lemire 是魁北克大学(TELUQ)的计算机科学教授。
文章评论情况
关于“所有 64 位整数中,只有 17% 是两个 32 位整数的乘积”有 3 条评论。