惊人发现:仅 17% 的 64 位整数可由两个 32 位整数相乘得到!

发布时间:2026/6/2 15:35:59

惊人发现:仅 17% 的 64 位整数可由两个 32 位整数相乘得到! 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/?v1#consulting 。他不接受任何广告但可在 GitHub 上赞助他的开源工作https://github.com/sponsors/lemire 。还可加入超过 12500 名邮件订阅者的行列在 GitHub 上关注他在 X 上关注他https://x.com/intent/follow?screen_namelemireshow_counttruesizelarge 超过 30000 名粉丝也能在 Telegramhttps://t.me/dlemire 上关注本博客。近期文章与评论近期文章有具身认知与能动 AIhttps://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 位整数的乘积关注此问题的原因在于常设计哈希函数几年前设计的超快速哈希函数 clhashhttps://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 位值的比例可精确计算。Websterhttps://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 条评论。

相关新闻