​割圆术

2024-10-07 11:51 来源:网络 点击:

割圆术

不妨将单位圆的内接正n边形的单边长度记为aₙ,则刘徽的割圆术,相当于计算 递推公式:

a₆=1a₂ₙ=√(2-√(4-aₙ²))

再将正n边形面积记为 Sₙ ,则有,

S₂ₙ=naₙ/2

设单位圆面积为 S,并且 根据面积关系,

S₂ₙ<S<2S₂ₙ - Sₙ

可 估算 圆周率的值 为,

π=S ≈ (3S₂ₙ+Sₙ)/2

又设 从 正六边形开始,割k次得到正n边形,则有,

k=log₂(n/6),n = 6 × 2ᵏ

于是,刘徽 最初 得到 96边形 需要进行 4次割圆(然后 求 192边形 的面积 不需要再割圆了),我们写一个 JS 程序试一下:

function liu(k) {
const cut = a => Math.sqrt(2 - Math.sqrt(4 - a*a));
let n = 6 * 2**k;
let a = 1, aa = 0;
while(k) {
aa = a;
a = cut(aa);
k--;
}
let S = n*a/2
let SS = n*aa/4;
SS = 2*S - SS
return [S, (S+SS)/2, SS]
}
> liu(4)
< [3.14103195089053, 3.1418728248123586, 3.1427136987341875]

输出有,

3.1410 < π ≈ 3.142 < 3.1427

OK!

西方的阿基米德,则同时使用了单位圆的内接和外切正n边形,分别记它们的 半周长为 Aₙ 和 Bₙ,则有递推公式:

A₄ = 2√2,B₄ = 2A₂ₙ=√(AₙB₂ₙ), B₂ₙ = 2AₙBₙ/(Aₙ + Bₙ)

有,

Aₙ < π < Bₙ

于是 圆周率的估算值为,

π ≈ (Aₙ + Bₙ)/2

设 从 正方形开始,割k次得到正n边形,则有,

k=log₂(n/4),n = 4 × 2ᵏ

马上写一个 JS 程序试一下:

function archimedes(k) {
const cutA = (A, cB) => Math.sqrt(A*cB);
const cutB = (A, B) => 2*A*B/(A+B);
let A = 2*Math.sqrt(2), B = 4;
while(k) {
B = cutB(A, B);
A = cutA(A, B);
k--;
}
return [A, (A + B)/2, B];
}
> archimedes(4)
< [3.1403311569547534, 3.142224771100329, 3.144118385245905]

输出有,

3.1403 < π ≈ 3.142 < 3.1441

显然没有 刘徽的方法 精确,不过 阿基米德 每次只算一个 开平方,比 刘徽的 每次计算 两个 开平方 的 运算量 少(但是 会多计算 两个乘法 和 一个除法)。

关于 割圆术的原理,见下图: