You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}"

原有代码修改说明

  1. 修复原有代码bug:c0函数内部递归调用错误写成了b0,所有分数计算尽量全程用Fraction类型存储,避免浮点数精度误差导致的相等判断失效。
  2. 替换三重根场景(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}')
  1. 涉及三角函数、复数根的不可约情形(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 09:51:45