024多精度大整数 - 突破硬件精度限制的任意精度运算

多精度大整数 - 突破硬件精度限制的任意精度运算

突破极限:大整数的简单天才

5W1H 发明者故事

Who(何人)- 发明者是谁?

发明背景 :多精度算术(Multi-Precision Arithmetic)并非单一发明者,而是由 1960 年代多个计算机科学和数学领域的研究者共同发展
关键人物

  • Donald E. Knuth(1938-):在《计算机程序设计艺术》第二卷 4.3.1节系统化了多精度算术算法,成为该领域的权威参考
  • IBM 科学家们:IBM 704/709 时代(1950-1960 年代),IBM 的工程师为科学计算开发了早期多精度库
  • 密码学界:RSA(1977年,Rivest、Shamir、Adleman)要求处理数百位的大整数,极大推动了高效大整数库的发展

当时的处境:IBM 704 的浮点精度只有 27 位,无法满足天文计算、核物理模拟等需要几十位有效数字的科学计算需求。

When(何时)- 什么时候发明的?

时间

  • 概念萌芽:1950 年代,早期科学计算对精度的需求
  • 系统化实现:1960 年代,Knuth 的 TAOCP 第二卷(1969年)给出了完整算法描述
  • 工程化普及:1970-1980 年代,GNU MP(GMP)等开源库出现
  • 密码学驱动:1977 年 RSA 算法发明后,大整数运算成为密码学基础设施

时代背景

  • 计算机浮点数最多 64 位,精度有限
  • 科学家需要验算数学猜想(如 Fermat 数的因式分解),需要数百位精度
  • 密码学的兴起使大整数运算成为安全基础设施的核心

Where(何地)- 在哪里发明的?

地点

  • 美国各大学和研究机构(MIT、斯坦福、贝尔实验室等)
  • IBM 研究中心(纽约约克镇高地)
  • 全球各大学的数学系和计算机系

环境

  • 大型科学计算机(IBM 360 系列)开始普及
  • 操作系统和编程语言刚刚成熟,程序员需要自己实现基础数学库
  • 国际数学界和计算机科学界的紧密合作

What(何事)- 发明了什么?

数据结构与算法 :多精度大整数(Bignum / Multi-precision Integer)
核心概念 :用一个整数数组模拟任意位数的整数运算,数组的每个元素代表一个"数字"(digit),但这个"数字"是以 10000 或 2^32 为基数的,而不是 10。就像小学列竖式加法:从最低位开始,逐位相加,处理进位。
关键突破

  • 任意精度:通过动态数组,理论上可以表示任意大的整数
  • 正确的进位处理:多精度加减法的进位逻辑
  • O(n²) 乘法:经典的长乘法,类似手工计算竖式
  • 基数选择:选择 10000 或 2^32 作为基数,在人类可读性和计算机效率之间取得平衡

Why(何因)- 为什么发明?

要解决的问题

  1. 硬件精度限制:64 位整数最大只有约 18 位十进制数,远不够密码学(2048 位)和数论研究使用
  2. 科学计算精度:天文常数、数学常数(π、e)的高精度计算
  3. 密码学:RSA 密钥生成需要处理数百位大质数
  4. 数论验证:验证 Goldbach 猜想、Collatz 猜想等数论问题需要大整数

当时的挑战

  • 没有硬件支持,完全用软件模拟
  • 内存有限,必须高效管理大数的存储
  • 正确处理负数、溢出和进位需要细致的逻辑

动机:科学家在计算机上处理 Mersenne 质数(形如 2^p-1 的质数)时,发现标准整数类型远远不够,只能手工模拟多位运算。

How(何果)- 如何实现?有什么影响?

实现思路

复制代码
大整数 = {sign, digits[], length}
其中 digits[0] 是最低位,digits[length-1] 是最高位
以 BASE=10000 为基数(每个 digit 代表4位十进制数)

加法:逐位相加 + 进位传播
减法:逐位相减 + 借位传播
乘法:O(n²) 双重循环,类似竖式乘法

历史影响

  • GNU Multiple Precision Arithmetic Library(GMP)成为密码学、计算机代数的标准库
  • OpenSSL、Java BigInteger、Python 内置 int 均基于类似思想
  • 数论研究(Mersenne 质数搜索、π 的位数计算)依赖大整数库
  • 区块链中的椭圆曲线密码学(secp256k1)全程依赖 256 位大整数运算

名言:Knuth 在 TAOCP 中写道:"多精度算术是计算机代数系统的基础,理解它就是理解计算机如何超越自身硬件限制。"


自然语言需求定义

需求名称:实现基于数组的多精度大整数,支持加、减、乘、比较和打印

功能需求(用精确的中文描述)

  1. 创建大整数:从字符串或长整数创建大整数

    • 输入:十进制字符串或 long long 值
    • 操作:解析数字,填充 digits 数组,设置 sign 和 length
    • 输出:BigInt 结构体指针
  2. 大整数加法:计算两个大整数之和

    • 输入:两个 BigInt 指针
    • 操作:同号则绝对值相加,异号则相减;逐位处理进位
    • 输出:结果 BigInt 指针
  3. 大整数减法:计算两个大整数之差

    • 输入:两个 BigInt 指针(a - b)
    • 操作:转化为加法(b 取反后相加)
    • 输出:结果 BigInt 指针
  4. 大整数乘法(O(n²)):计算两个大整数之积

    • 输入:两个 BigInt 指针
    • 操作:双重循环,类似竖式乘法,逐位相乘后累加
    • 输出:结果 BigInt 指针
  5. 大整数比较:比较两个大整数的大小

    • 输入:两个 BigInt 指针
    • 输出:-1(a<b)、0(a==b)、1(a>b)
  6. 打印大整数:以十进制字符串形式打印

    • 输入:BigInt 指针
    • 输出:打印到 stdout
  7. 释放内存:释放 BigInt 及其内部数组

    • 输入:BigInt 指针
    • 输出:无

约束条件

  • 基数 BASE = 10000(每个 digit 存4位十进制数)
  • 使用动态数组,支持任意精度
  • 正确处理负号(sign 字段)
  • 结果的 digits 数组不含前导零(最高 digit 不为0,除非值为0)

验收标准(必须可验证)

编号 测试场景(自然语言描述) 预期结果 验证方式
1 999999 + 1 1000000 字符串比较结果
2 123456789 + 987654321 1111111110 精确结果对比
3 1000000 - 999999 1 字符串比较
4 99999 × 99999 9999800001 精确结果对比
5 比较 999999 与 1000000 999999 < 1000000(返回-1) 比较函数返回值
6 大数乘法:9位×9位 精确18位结果 与预计算结果对比
7 0 + 任意数 任意数本身 加0不变

AI 生成提示

复制代码
基于以上需求和验收标准,用标准C语言实现多精度大整数。

要求:
1. 使用标准C99
2. BASE=10000,digits[0]为最低位
3. BigInt结构体:{int sign; unsigned int* digits; int length; int capacity}
4. 完整的加减乘比较打印函数
5. 所有malloc对应free
6. 在main中实现全部7个验收标准
7. 测试通过输出 "✓ 测试X通过",失败输出 "✗ 测试X失败"

核心函数:
- bigint_from_string(str) / bigint_from_ll(val)
- bigint_add(a, b) / bigint_sub(a, b) / bigint_mul(a, b)
- bigint_cmp(a, b)
- bigint_print(a) / bigint_to_string(a, buf)
- bigint_free(a)

C语言实现文件

对应文件 : big_integer.c

编译运行:

bash 复制代码
gcc -std=c99 -Wall -o bigint_test big_integer.c
./bigint_test

核心函数:

  • bigint_from_string(str) - 从十进制字符串创建大整数
  • bigint_add(a, b) / bigint_sub(a, b) / bigint_mul(a, b) - 四则运算
  • bigint_cmp(a, b) - 大小比较
  • bigint_print(a) - 打印
  • bigint_free(a) - 释放内存
相关推荐
IronMurphy1 小时前
【算法四十五】139. 单词拆分
算法
洛水水2 小时前
【力扣100题】32.将有序数组转换为二叉搜索树
数据结构·算法·leetcode
如竟没有火炬3 小时前
用队列实现栈
开发语言·数据结构·python·算法·leetcode·深度优先
RH2312113 小时前
2026.5.12 Linux
java·linux·数据结构
云栖梦泽在3 小时前
AI安全入门:AI模型泄露的风险与防护措施
人工智能·算法·动态规划
水木流年追梦4 小时前
大模型入门-应用篇3-Agent智能体
开发语言·python·算法·leetcode·正则表达式
洛水水4 小时前
【力扣100题】31.二叉树的层序遍历
算法·leetcode·职场和发展
君义_noip4 小时前
CSP-S 2025 入门级 第一轮(初赛) 完善程序(1)
c++·算法·信息学奥赛·初赛·csp 第一轮
洛水水4 小时前
【力扣100题】41.爬楼梯
算法·leetcode·职场和发展