Python实现分数立方根分母有理化 输出三次方程精确形式解
分数形式立方根实现方案
核心目标:替换原有浮点数立方根计算,输出「分母无立方根、仅分子保留立方根、系数为最简分数」的精确结果,适配三次方程求解器的精确输出需求。
输出规则参考
- 正确:∛10 / ∛56 = ∛490/14,错误:输出0.56312394类小数
- 正确:∛1 / ∛27 = 1/3,错误:输出0.333333333类小数
- 正确:∛48 / ∛9 = 2∛18/3(自动约分为最简,比示例的6∛18/9更简),错误:输出1.74716092类小数
核心实现代码
首先导入依赖:
import math from fractions import Fraction
工具1:整数立方因子化简
将整数拆分为「可开尽立方的系数」和「无立方因子的剩余部分」,自动处理正负号:
def simplify_cube_integer(n: int) -> tuple[int, int]: if n == 0: return (0, 1) sign = 1 if n < 0: sign = -1 n = -n coeff = 1 max_check = round(n ** (1/3)) + 2 for i in range(2, max_check + 1): cube = i ** 3 while n % cube == 0: coeff *= i n = n // cube return (sign * coeff, n)
工具2:分数立方根格式化
输入fractions.Fraction类型的分数,自动完成分母有理化、约分,返回符合要求的精确形式字符串:
def format_cbrt_fraction(frac: Fraction) -> str: if frac == 0: return "0" # 拆分分子分母,做分母有理化:分子分母同乘分母平方,让分母变为完全立方数 num = frac.numerator * (frac.denominator ** 2) den_cubed = frac.denominator ** 3 # 分母开立方得到整数 den_coeff = round(den_cubed ** (1/3)) # 化简分子的立方因子 num_coeff, num_rad = simplify_cube_integer(num) # 约掉分子系数和分母的公因子 gcd_val = math.gcd(abs(num_coeff), den_coeff) num_coeff //= gcd_val den_coeff //= gcd_val # 拼接分子部分 if num_rad == 1: if num_coeff == 1: num_part = "" elif num_coeff == -1: num_part = "-" else: num_part = str(num_coeff) else: if num_coeff == 1: num_part = f"∛{num_rad}" elif num_coeff == -1: num_part = f"-∛{num_rad}" else: num_part = f"{num_coeff}∛{num_rad}" # 拼接最终结果 return num_part if den_coeff == 1 else f"{num_part}/{den_coeff}"
原有代码修改说明
- 修复原有代码bug:
c0函数内部递归调用错误写成了b0,所有分数计算尽量全程用Fraction类型存储,避免浮点数精度误差导致的相等判断失效。 - 替换三重根场景(f=g=h=0)的原有逻辑,不要用浮点数计算立方根,直接传入分数对象格式化:
# 注意这里用分数版本的f/g/h判断,不要用浮点数版本 if f_frac == 0 and g_frac == 0 and h_frac == 0: root_val = -c0_frac root_str = format_cbrt_fraction(root_val) print(f'x₁ = {root_str}') print(f'x₂ = {root_str}') print(f'x₃ = {root_str}')
- 涉及三角函数、复数根的不可约情形(h≤0)可以保留原有浮点数计算逻辑,这部分本身无法用纯实数根式表示为简单分数形式。
测试验证
print(format_cbrt_fraction(Fraction(10, 56))) # 输出 ∛490/14 print(format_cbrt_fraction(Fraction(1, 27))) # 输出 1/3 print(format_cbrt_fraction(Fraction(48, 9))) # 输出 2∛18/3 print(format_cbrt_fraction(Fraction(-8, 125))) # 输出 -2/5
内容的提问来源于stack exchange,提问作者Patman1O1
相关产品推荐
相关产品推荐

