Skip to content

tortb/PiCalculator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

HPC π 计算器 v2.1-HPC

基于 Chudnovsky 算法的高性能 π 计算器,支持稳定计算 1000 位~10 亿位 π 值。

🚀 快速开始

系统要求

  • Java: JDK 21 或更高版本
  • 内存: 至少 2GB RAM(推荐 4GB+)
  • 磁盘: 至少 100MB 可用空间

1. 编译项目

Linux / macOS

./build.sh

Windows (PowerShell)

# 进入项目目录
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 .

Windows (CMD)

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 .

2. 运行程序

Linux / macOS

# 方法 1:使用便捷脚本(推荐 - 自动内存管理)
./tor-pi 1000000

# 方法 2:使用 run.sh
./run.sh 1000000

# 方法 3:直接运行 JAR(手动指定内存)
java -Xms2G -Xmx4G -jar target/PiCalculator-2.1-HPC.jar 1000000

Windows (PowerShell)

# 直接运行 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 Normal

Windows (CMD)

REM 直接运行 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

3. 常用位数命令

位数 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 小时

🖥️ 各平台详细指南

Linux

环境准备

# 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-openjdk

验证 Java 安装

java -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

Linux 性能优化建议

# 启用大页面(需要 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

Linux 注意事项

  • 确保有足够的磁盘空间用于输出文件(1 亿位约 100MB)
  • 使用 htoptop 监控计算过程中的 CPU 和内存使用
  • 如果使用 systemd 服务,建议设置 LimitNOFILE=65536

macOS

环境准备

# 使用 Homebrew 安装 Java
brew install openjdk@21

# 或者从 Oracle 官网下载 JDK 21
# https://www.oracle.com/java/technologies/downloads/

配置 Java 环境

# 添加 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

macOS 注意事项

  • Apple Silicon (M1/M2/M3): Java 21 原生支持 ARM64 架构,性能优秀
  • Intel Mac: 确保使用 x86_64 版本的 JDK
  • 文件系统: macOS 默认文件系统不区分大小写,路径大小写错误可能导致问题
  • 性能优化: 在"系统偏好设置 > 电池 > 选项"中设置为"高性能"模式
  • 内存限制: macOS 内存压缩可能影响性能,建议关闭其他大型应用

Windows

环境准备

  1. 下载并安装 JDK 21

  2. 验证安装

    java -version
    javac -version

    如果命令未找到,需要配置环境变量:

    • 右键"此电脑" > "属性" > "高级系统设置" > "环境变量"
    • 在"系统变量"中添加:
      • JAVA_HOME: C:\Program Files\Eclipse Adoptium\jdk-21.x.x.x-hotspot(根据实际安装路径)
      • 编辑 Path,添加:%JAVA_HOME%\bin
  3. 验证配置

    echo %JAVA_HOME%
    java -version
    javac -version

编译项目

使用 PowerShell(推荐)
# 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.jar
使用 CMD
REM 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 1000000
REM CMD
java -Xms2G -Xmx4G -jar target\PiCalculator-2.1-HPC.jar 1000000
高性能运行
REM 使用高优先级(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

Windows 性能优化建议

  1. 设置高优先级

    start /HIGH java -Xms4G -Xmx8G -jar target\PiCalculator-2.1-HPC.jar 1000000
  2. 禁用实时防病毒扫描(临时)

    • Windows 安全中心 > 病毒和威胁防护 > 管理设置 > 排除项
    • 将项目目录添加到排除列表
  3. 使用 SSD 存储

    • 确保项目和输出文件位于 SSD 上
    • 避免使用网络驱动器或 USB 驱动器
  4. 关闭不必要的程序

    • 释放更多内存和 CPU 资源
    • 特别是浏览器、IDE 等内存占用大的程序
  5. 电源计划设置

    • 控制面板 > 电源选项 > 选择"高性能"计划
    • 或创建自定义计划,设置最小处理器状态为 100%
  6. 大页面支持(高级)

    • 运行 secpol.msc
    • 本地策略 > 用户权限分配 > 锁定内存中的页面
    • 添加当前用户

Windows 注意事项

  • 路径分隔符: Windows 使用反斜杠 \,但在 Java 命令中正斜杠 / 也可用
  • 命令行长度: CMD 有 8191 字符限制,但运行 JAR 不受影响
  • 编码问题: 如果输出中文乱码,使用 chcp 65001 切换到 UTF-8
  • Windows Terminal: 推荐使用 Windows Terminal 获得更好的终端体验
  • WSL: 也可以使用 WSL2 运行 Linux 版本的脚本

✨ v2.1 核心特性

算法特性

  • Chudnovsky 算法 - 每项增加约 14.18 位精度
  • Binary Splitting - 分治策略降低计算复杂度
  • ForkJoinPool 并行 - 充分利用多核 CPU
  • 整数缩放算术 - 避免 BigDecimal 精度损失

HPC 优化

  • Block Division 10^200000 - 每次输出 20 万位,除法次数减少 95%
  • Karatsuba 乘法 - O(n^1.58) 复杂度,万位以上乘法提升 3-5 倍
  • 分治 toString - O(n log n) 转换,百万位提升 5-10 倍
  • 2MB 缓冲写入 - 减少系统调用
  • 精确整数平方根 - 高精度 sqrt(10005) 计算

监控与诊断

  • ✅ 实时进度显示
  • ✅ 阶段耗时统计
  • ✅ 计算速度监控
  • ✅ 内存使用情况

📊 性能基准

当前性能(4 核 CPU,8GB 内存)

位数 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 参数建议

根据位数调整内存

位数 建议内存 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       # 并行引用处理

平台特定参数

Linux

java -Xms4G -Xmx8G -XX:+UseG1GC -XX:+UseNUMA -XX:+AlwaysPreTouch \
     -jar target/PiCalculator-2.1-HPC.jar 1000000

macOS

java -Xms4G -Xmx8G -XX:+UseG1GC -XX:+AlwaysPreTouch \
     -jar target/PiCalculator-2.1-HPC.jar 1000000

Windows (CMD)

java -Xms4G -Xmx8G -XX:+UseG1GC -XX:+AlwaysPreTouch ^
     -jar target\PiCalculator-2.1-HPC.jar 1000000

Windows (PowerShell)

java -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                          
╚═══════════════════════════════════════════════════════════

🧮 算法说明

Chudnovsky 公式

$$\frac{1}{\pi} = 12 \sum_{k=0}^{\infty} \frac{(-1)^k (6k)! (545140134k + 13591409)}{(3k)! (k!)^3 (640320)^{3k+3/2}}$$

Binary Splitting

基础项(当 $b - a = 1$ 时):

  • $a = 0$:$P = 1, Q = 1, T = 13591409$
  • $a &gt; 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

最终 π 计算$$\pi = \frac{426880 \times \sqrt{10005} \times Q}{T}$$


🏗️ 架构组件

组件 说明 优化
PiCalculator 主入口 进度监控、性能统计
PiEngine 计算引擎 并行计算、动态线程
BinarySplitTask Binary Splitting 任务 ForkJoinPool 并行
StreamingDivisionEngine 流式除法引擎 Block 10^200000
NewtonDivision 高精度除法 BigInteger 原生
KaratsubaBigInteger Karatsuba 乘法 O(n^1.58)
BigIntegerToString 分治 toString O(n log n)

🚀 下一步优化计划

短期(1 月)

  1. Maven 编译支持

    • 恢复 Maven 编译流程
    • 支持依赖管理
  2. 更大位数优化

    • 优化 1000 万位以上计算性能
    • 减少内存占用

中期(2-3 月)

  1. FFT 大整数乘法

    • 实现 FFT 乘法(O(n log n))
    • 对于>50000 位的乘法使用 FFT
  2. 检查点恢复

    • 支持从断点恢复计算
    • GZIP 压缩存储

长期(3-6 月)

  1. GPU 加速

    • 使用 OpenCL 或 CUDA
    • 并行化 Binary Splitting 和 Block Division
  2. GMP 库(JNI)

    • 通过 JNI 调用 GMP 库
    • C 实现的高性能大整数库

🛠️ 启动脚本说明

可用脚本

脚本 功能 Linux/macOS Windows
build.sh 编译项目 ❌(使用手动命令)
tor-pi 便捷启动 ❌(直接运行 JAR)
run.sh 运行脚本 ❌(直接运行 JAR)
install.sh 全局安装

Linux/macOS 使用示例

# 1. 编译
./build.sh

# 2. 快速运行(自动内存管理)
./tor-pi 1000000

# 3. 全局安装后
sudo ./install.sh
tor-pi 1000000  # 可在任意目录使用

Windows 使用示例

# 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

找不到 Java

Linux

sudo apt-get install openjdk-21-jdk

macOS

brew install openjdk@21

Windows

  • OracleAdoptium 下载 JDK 21
  • 配置 JAVA_HOME 环境变量
  • %JAVA_HOME%\bin 添加到 Path

验证计算结果

# 前 50 位应该是:
# 3.14159265358979323846264338327950288419716939937510
head -6 pi_1000_digits.md

权限问题(Linux/macOS)

# 赋予脚本执行权限
chmod +x build.sh run.sh tor-pi

# 如果 target 目录权限问题
sudo chown -R $USER:$USER target

Windows 特有问题

编译错误:找不到 javac

解决:确保安装了完整的 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 行一个空行分隔,形成视觉块
  • 文件头部包含精度信息

📦 全局安装(Linux/macOS)

sudo ./install.sh

安装后可在任意目录使用:

tor-pi 1000000

📄 许可证

MIT License

🙏 致谢

  • Chudnovsky 兄弟的 π 计算公式
  • Java ForkJoin 框架
  • OpenJDK 社区
  • Karatsuba 算法

版本: v2.1-HPC
最后更新: 2026 年 4 月 18 日
作者: tortb

About

一个圆周率计算器

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors