基于 Chudnovsky 算法的高性能 π 计算器,支持稳定计算 1000 位~10 亿位 π 值。
- Java: JDK 21 或更高版本
- 内存: 至少 2GB RAM(推荐 4GB+)
- 磁盘: 至少 100MB 可用空间
./build.sh# 进入项目目录
cd C:\path\to\PiCalculator
# 创建目标目录
New-Item -ItemType Directory -Force -Path target
# 编译 Java 源文件
javac -d target src\main\java\*.java
# 打包 JAR 文件
jar cfe target\PiCalculator-2.1-HPC.jar Main -C target .REM 进入项目目录
cd C:\path\to\PiCalculator
REM 创建目标目录
mkdir target
REM 编译 Java 源文件
javac -d target src\main\java\*.java
REM 打包 JAR 文件
jar cfe target\PiCalculator-2.1-HPC.jar Main -C target .# 方法 1:使用便捷脚本(推荐 - 自动内存管理)
./tor-pi 1000000
# 方法 2:使用 run.sh
./run.sh 1000000
# 方法 3:直接运行 JAR(手动指定内存)
java -Xms2G -Xmx4G -jar target/PiCalculator-2.1-HPC.jar 1000000# 直接运行 JAR(推荐)
java -Xms2G -Xmx4G -jar target\PiCalculator-2.1-HPC.jar 1000000
# 使用高优先级运行
Start-Process -FilePath java -ArgumentList "-Xms2G","-Xmx4G","-jar","target\PiCalculator-2.1-HPC.jar","1000000" -WindowStyle NormalREM 直接运行 JAR
java -Xms2G -Xmx4G -jar target\PiCalculator-2.1-HPC.jar 1000000
REM 使用高优先级运行
start /HIGH java -Xms2G -Xmx4G -jar target\PiCalculator-2.1-HPC.jar 1000000| 位数 | Linux/macOS 命令 | Windows 命令 | 预计时间 |
|---|---|---|---|
| 1000 | ./tor-pi 1000 |
java -jar target\PiCalculator-2.1-HPC.jar 1000 |
< 0.1 秒 |
| 10 万 | ./tor-pi 100000 |
java -jar target\PiCalculator-2.1-HPC.jar 100000 |
~1.5 秒 |
| 100 万 | ./tor-pi 1000000 |
java -jar target\PiCalculator-2.1-HPC.jar 1000000 |
~35 秒 |
| 1000 万 | ./tor-pi 10000000 |
java -jar target\PiCalculator-2.1-HPC.jar 10000000 |
~8 分钟 |
| 1 亿 | ./tor-pi 100000000 |
java -jar target\PiCalculator-2.1-HPC.jar 100000000 |
~2 小时 |
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install openjdk-21-jdk
# CentOS/RHEL/Fedora
sudo dnf install java-21-openjdk-devel
# Arch Linux
sudo pacman -S jdk21-openjdkjava -version
# 应显示类似:openjdk version "21.0.x"
javac -version
# 应显示类似:javac 21.0.x# 1. 赋予脚本执行权限
chmod +x build.sh run.sh tor-pi
# 2. 编译
./build.sh
# 3. 运行(自动内存管理 - 推荐)
./tor-pi 1000000
# 4. 或使用 run.sh(显示详细配置)
./run.sh 1000000
# 5. 或手动指定参数
java -Xms2G -Xmx4G -XX:+UseG1GC -jar target/PiCalculator-2.1-HPC.jar 1000000# 启用大页面(需要 root 权限)
sudo sysctl vm.nr_hugepages=2048
# 设置 CPU 性能模式
sudo cpupower frequency-set -g performance
# 清理页面缓存(计算前)
echo 1 | sudo tee /proc/sys/vm/drop_caches
# 使用 numactl 绑定 NUMA 节点(多路 CPU 系统)
numactl --membind=0 --cpunodebind=0 java -Xms4G -Xmx8G -jar target/PiCalculator-2.1-HPC.jar 1000000- 确保有足够的磁盘空间用于输出文件(1 亿位约 100MB)
- 使用
htop或top监控计算过程中的 CPU 和内存使用 - 如果使用 systemd 服务,建议设置
LimitNOFILE=65536
# 使用 Homebrew 安装 Java
brew install openjdk@21
# 或者从 Oracle 官网下载 JDK 21
# https://www.oracle.com/java/technologies/downloads/# 添加 Java 到 PATH(zsh - macOS 默认 shell)
echo 'export PATH="/opt/homebrew/opt/openjdk@21/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
# Intel Mac 使用此路径
# echo 'export PATH="/usr/local/opt/openjdk@21/bin:$PATH"' >> ~/.zshrc
# 验证安装
java -version
javac -version# 1. 赋予脚本执行权限
chmod +x build.sh run.sh tor-pi
# 2. 编译
./build.sh
# 3. 运行(自动内存管理 - 推荐)
./tor-pi 1000000
# 4. 或手动运行
java -Xms2G -Xmx4G -XX:+UseG1GC -jar target/PiCalculator-2.1-HPC.jar 1000000- Apple Silicon (M1/M2/M3): Java 21 原生支持 ARM64 架构,性能优秀
- Intel Mac: 确保使用 x86_64 版本的 JDK
- 文件系统: macOS 默认文件系统不区分大小写,路径大小写错误可能导致问题
- 性能优化: 在"系统偏好设置 > 电池 > 选项"中设置为"高性能"模式
- 内存限制: macOS 内存压缩可能影响性能,建议关闭其他大型应用
-
下载并安装 JDK 21
- 访问 Oracle JDK 下载页面
- 或使用 Adoptium (Eclipse Temurin)(推荐,免费开源)
- 选择 Windows x64 MSI 安装包
-
验证安装
java -version javac -version
如果命令未找到,需要配置环境变量:
- 右键"此电脑" > "属性" > "高级系统设置" > "环境变量"
- 在"系统变量"中添加:
JAVA_HOME:C:\Program Files\Eclipse Adoptium\jdk-21.x.x.x-hotspot(根据实际安装路径)- 编辑
Path,添加:%JAVA_HOME%\bin
-
验证配置
echo %JAVA_HOME% java -version javac -version
# 1. 进入项目目录
cd C:\path\to\PiCalculator
# 2. 创建目标目录
New-Item -ItemType Directory -Force -Path target
# 3. 编译所有 Java 源文件
javac -d target src\main\java\*.java
# 4. 打包为可执行 JAR
jar cfe target\PiCalculator-2.1-HPC.jar Main -C target .
# 5. 验证 JAR 文件
Test-Path target\PiCalculator-2.1-HPC.jarREM 1. 进入项目目录
cd C:\path\to\PiCalculator
REM 2. 创建目标目录
mkdir target
REM 3. 编译所有 Java 源文件
javac -d target src\main\java\*.java
REM 4. 打包为可执行 JAR
jar cfe target\PiCalculator-2.1-HPC.jar Main -C target .
REM 5. 验证 JAR 文件
dir target\PiCalculator-2.1-HPC.jar创建 build.bat 文件:
@echo off
echo 正在编译 PiCalculator...
mkdir target 2>nul
javac -d target src\main\java\*.java
if %errorlevel% neq 0 (
echo 编译失败!
exit /b 1
)
jar cfe target\PiCalculator-2.1-HPC.jar Main -C target .
if %errorlevel% neq 0 (
echo 打包失败!
exit /b 1
)
echo 编译完成!
echo JAR 文件:target\PiCalculator-2.1-HPC.jar# PowerShell
java -Xms2G -Xmx4G -jar target\PiCalculator-2.1-HPC.jar 1000000REM CMD
java -Xms2G -Xmx4G -jar target\PiCalculator-2.1-HPC.jar 1000000REM 使用高优先级(CMD)
start /HIGH /WAIT java -Xms4G -Xmx8G -XX:+UseG1GC -jar target\PiCalculator-2.1-HPC.jar 1000000# 使用高优先级(PowerShell)
$process = Start-Process -FilePath java -ArgumentList "-Xms4G","-Xmx8G","-XX:+UseG1GC","-jar","target\PiCalculator-2.1-HPC.jar","1000000" -PassThru -WindowStyle Normal
$process.PriorityClass = "High"
Wait-Process -Id $process.Id创建 tor-pi.bat 文件:
@echo off
if "%1"=="" (
echo 用法:tor-pi ^<位数^>
echo 示例:tor-pi 1000000
exit /b 1
)
java -Xms2G -Xmx4G -XX:+UseG1GC -jar target\PiCalculator-2.1-HPC.jar %1-
设置高优先级
start /HIGH java -Xms4G -Xmx8G -jar target\PiCalculator-2.1-HPC.jar 1000000
-
禁用实时防病毒扫描(临时)
- Windows 安全中心 > 病毒和威胁防护 > 管理设置 > 排除项
- 将项目目录添加到排除列表
-
使用 SSD 存储
- 确保项目和输出文件位于 SSD 上
- 避免使用网络驱动器或 USB 驱动器
-
关闭不必要的程序
- 释放更多内存和 CPU 资源
- 特别是浏览器、IDE 等内存占用大的程序
-
电源计划设置
- 控制面板 > 电源选项 > 选择"高性能"计划
- 或创建自定义计划,设置最小处理器状态为 100%
-
大页面支持(高级)
- 运行
secpol.msc - 本地策略 > 用户权限分配 > 锁定内存中的页面
- 添加当前用户
- 运行
- 路径分隔符: Windows 使用反斜杠
\,但在 Java 命令中正斜杠/也可用 - 命令行长度: CMD 有 8191 字符限制,但运行 JAR 不受影响
- 编码问题: 如果输出中文乱码,使用
chcp 65001切换到 UTF-8 - Windows Terminal: 推荐使用 Windows Terminal 获得更好的终端体验
- WSL: 也可以使用 WSL2 运行 Linux 版本的脚本
- ✅ Chudnovsky 算法 - 每项增加约 14.18 位精度
- ✅ Binary Splitting - 分治策略降低计算复杂度
- ✅ ForkJoinPool 并行 - 充分利用多核 CPU
- ✅ 整数缩放算术 - 避免 BigDecimal 精度损失
- ✅ Block Division 10^200000 - 每次输出 20 万位,除法次数减少 95%
- ✅ Karatsuba 乘法 - O(n^1.58) 复杂度,万位以上乘法提升 3-5 倍
- ✅ 分治 toString - O(n log n) 转换,百万位提升 5-10 倍
- ✅ 2MB 缓冲写入 - 减少系统调用
- ✅ 精确整数平方根 - 高精度 sqrt(10005) 计算
- ✅ 实时进度显示
- ✅ 阶段耗时统计
- ✅ 计算速度监控
- ✅ 内存使用情况
| 位数 | Binary Splitting | Streaming Division | 总耗时 | 速度 |
|---|---|---|---|---|
| 1,000 | < 0.01 秒 | < 0.01 秒 | < 0.1 秒 | - |
| 10,000 | < 0.01 秒 | < 0.01 秒 | ~0.5 秒 | 20,000 位/秒 |
| 100,000 | ~0.1 秒 | ~0.5 秒 | ~1.5 秒 | 66,667 位/秒 |
| 1,000,000 | ~10 秒 | ~25 秒 | ~35 秒 | 28,571 位/秒 |
| 10,000,000 | ~100 秒 | ~380 秒 | ~8 分钟 | 20,833 位/秒 |
| 版本 | 优化项 | 1000 位耗时 | 10000 位耗时 |
|---|---|---|---|
| v1.0 | 原始版本(BigDecimal) | 错误输出 | 错误输出 |
| v2.0 | 修复精度问题 | ~1 秒 | ~5 秒 |
| v2.1 | 整数缩放 + 优化除法 | < 0.1 秒 | ~0.5 秒 |
| 位数 | 建议内存 | JVM 参数示例 |
|---|---|---|
| < 10 万 | 512MB-1GB | -Xms512M -Xmx1G |
| 100 万 | 2-3GB | -Xms2G -Xmx3G |
| 1000 万 | 4-6GB | -Xms4G -Xmx6G |
| 1 亿 | 8-16GB | -Xms8G -Xmx16G |
| 10 亿 | 16-32GB | -Xms16G -Xmx32G |
# 标准优化
-Xms4G -Xmx8G # 堆内存大小
-XX:+UseG1GC # G1 垃圾收集器
-XX:+UseNUMA # NUMA 优化(多路 CPU,Linux)
-XX:+AlwaysPreTouch # 预触内存页
# 高级优化(可选)
-XX:MaxGCPauseMillis=200 # 最大 GC 暂停时间
-XX:+ParallelRefProcEnabled # 并行引用处理java -Xms4G -Xmx8G -XX:+UseG1GC -XX:+UseNUMA -XX:+AlwaysPreTouch \
-jar target/PiCalculator-2.1-HPC.jar 1000000java -Xms4G -Xmx8G -XX:+UseG1GC -XX:+AlwaysPreTouch \
-jar target/PiCalculator-2.1-HPC.jar 1000000java -Xms4G -Xmx8G -XX:+UseG1GC -XX:+AlwaysPreTouch ^
-jar target\PiCalculator-2.1-HPC.jar 1000000java -Xms4G -Xmx8G -XX:+UseG1GC -XX:+AlwaysPreTouch `
-jar target\PiCalculator-2.1-HPC.jar 1000000╔═══════════════════════════════════════════════════════════
║ π 值计算任务
╠═══════════════════════════════════════════════════════════
║ 目标精度:10,000 位 (0.01 MB 输出)
║ 迭代次数:715 次 (Chudnovsky 算法,每项~14.18 位)
║ CPU 核心数:4 (使用 4 线程)
║ 最大堆内存:1,836 MB
║ 计算模式:单次计算
╚═══════════════════════════════════════════════════════════
[计算] 执行单次 Binary Splitting...
迭代范围:[0, 715)
[并行配置] 线程数:4
✓ Binary Splitting 完成,耗时 0.03 秒
✓ T 值位数:16,647
✓ Q 值位数:16,640
[π 值计算] 计算分子 = 426880 × √10005 × Q...
[π 值计算] 完成,分子位数:26,698 (缩放因子: 10^10050)
[输出] 开始流式输出到文件:pi_10000_digits.md
[流式引擎] 开始 Block Division 计算 π 值...
分子位数:26,698
分母位数:16,647
目标精度:10,000 位
缩放因子:10^10050
块大小:200,000 位 (10^200000)
整数部分:3 (1 位)
小数部分前20位:14159265358979323846
[流式引擎] 完成,耗时 0.03 秒,速度 392937 位/秒
π 值已保存到:pi_10000_digits.md
╔═══════════════════════════════════════════════════════════
║ 计算完成 ✓
╠═══════════════════════════════════════════════════════════
║ 目标精度:10,000 位 (0.01 MB)
║ 总耗时:1.22 秒
║ 计算速度:8,216.93 位/秒
║ 输出文件:pi_10000_digits.md
╚═══════════════════════════════════════════════════════════
基础项(当
- 若
$a = 0$ :$P = 1, Q = 1, T = 13591409$ - 若
$a > 0$ :$P = (6a-5)(2a-1)(6a-1)$ $Q = a^3 \times 10939058860032000$ $T = (13591409 + 545140134a) \times P \times (-1)^a$
合并公式:
P = P_left × P_right
Q = Q_left × Q_right
T = T_left × Q_right + P_left × T_right
最终 π 计算:
| 组件 | 说明 | 优化 |
|---|---|---|
PiCalculator |
主入口 | 进度监控、性能统计 |
PiEngine |
计算引擎 | 并行计算、动态线程 |
BinarySplitTask |
Binary Splitting 任务 | ForkJoinPool 并行 |
StreamingDivisionEngine |
流式除法引擎 | Block 10^200000 |
NewtonDivision |
高精度除法 | BigInteger 原生 |
KaratsubaBigInteger |
Karatsuba 乘法 | O(n^1.58) |
BigIntegerToString |
分治 toString | O(n log n) |
-
Maven 编译支持
- 恢复 Maven 编译流程
- 支持依赖管理
-
更大位数优化
- 优化 1000 万位以上计算性能
- 减少内存占用
-
FFT 大整数乘法
- 实现 FFT 乘法(O(n log n))
- 对于>50000 位的乘法使用 FFT
-
检查点恢复
- 支持从断点恢复计算
- GZIP 压缩存储
-
GPU 加速
- 使用 OpenCL 或 CUDA
- 并行化 Binary Splitting 和 Block Division
-
GMP 库(JNI)
- 通过 JNI 调用 GMP 库
- C 实现的高性能大整数库
| 脚本 | 功能 | Linux/macOS | Windows |
|---|---|---|---|
build.sh |
编译项目 | ✅ | ❌(使用手动命令) |
tor-pi |
便捷启动 | ✅ | ❌(直接运行 JAR) |
run.sh |
运行脚本 | ✅ | ❌(直接运行 JAR) |
install.sh |
全局安装 | ✅ | ❌ |
# 1. 编译
./build.sh
# 2. 快速运行(自动内存管理)
./tor-pi 1000000
# 3. 全局安装后
sudo ./install.sh
tor-pi 1000000 # 可在任意目录使用# 1. 编译
New-Item -ItemType Directory -Force -Path target
javac -d target src\main\java\*.java
jar cfe target\PiCalculator-2.1-HPC.jar Main -C target .
# 2. 运行
java -Xms2G -Xmx4G -jar target\PiCalculator-2.1-HPC.jar 1000000错误:Java heap space
解决:增加-Xmx 参数
java -Xmx8G -jar target/PiCalculator-2.1-HPC.jar 1000000
sudo apt-get install openjdk-21-jdkbrew install openjdk@21# 前 50 位应该是:
# 3.14159265358979323846264338327950288419716939937510
head -6 pi_1000_digits.md# 赋予脚本执行权限
chmod +x build.sh run.sh tor-pi
# 如果 target 目录权限问题
sudo chown -R $USER:$USER target解决:确保安装了完整的 JDK(不是 JRE)
检查:javac -version
解决:重新编译并打包 JAR
jar cfe target\PiCalculator-2.1-HPC.jar Main -C target .
REM 切换到 UTF-8 编码
chcp 65001
java -Xms2G -Xmx4G -jar target\PiCalculator-2.1-HPC.jar 1000000结果保存为 Markdown 文件,格式如下:
# π 值计算结果 (Chudnovsky 算法)
# 精度:1000000 位
# 生成时间:Sat Apr 18 10:00:00 CST 2026
3.14159265358979323846264338327950288419716939937510...- 每行 100 位数字,便于阅读和核对
- 每 10 行一个空行分隔,形成视觉块
- 文件头部包含精度信息
sudo ./install.sh安装后可在任意目录使用:
tor-pi 1000000MIT License
- Chudnovsky 兄弟的 π 计算公式
- Java ForkJoin 框架
- OpenJDK 社区
- Karatsuba 算法
版本: v2.1-HPC
最后更新: 2026 年 4 月 18 日
作者: tortb