将项转换为值而不损失精度(分数)

2024-05-23 15:54:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python pet_cycleind_symmNM(n, m)中有一个函数,当调用它的值pet_cycleind_symmNM(5, 5)时,它返回一个“术语列表”

[[Fraction(1, 14400), [[1, 25]]], [Fraction(1, 720), [[2, 5], [1, 15]]], [Fraction(1, 360), [[3, 5], [1, 10]]], [Fraction(1, 480), [[2, 10], [1, 5]]], [Fraction(1, 240), [[4, 5], [1, 5]]], [Fraction(1, 360), [[3, 5], [2, 5]]], [Fraction(13, 300), [[5, 5]]], [Fraction(1, 144), [[2, 8], [2, -2], [1, 9]]], [Fraction(1, 36), [[6, 1], [2, 2], [3, 3], [1, 6]]], [Fraction(1, 48), [[2, 11], [2, -2], [1, 3]]], [Fraction(1, 24), [[4, 5], [2, 1], [1, 3]]], [Fraction(1, 36), [[6, 1], [2, 5], [3, 3]]], [Fraction(1, 30), [[10, 1], [5, 3]]], [Fraction(1, 36), [[3, 7], [3, -2], [1, 4]]], [Fraction(1, 24), [[6, 2], [3, 1], [2, 4], [1, 2]]], [Fraction(1, 12), [[12, 1], [3, 1], [4, 2], [1, 2]]], [Fraction(1, 18), [[3, 5], [6, 1], [2, 2]]], [Fraction(1, 15), [[15, 1], [5, 2]]], [Fraction(1, 64), [[2, 12], [2, -2], [1, 1]]], [Fraction(1, 16), [[4, 5], [2, 2], [1, 1]]], [Fraction(1, 24), [[6, 2], [2, 5], [3, 1]]], [Fraction(1, 20), [[10, 2], [5, 1]]], [Fraction(1, 16), [[4, 6], [4, -2], [1, 1]]], [Fraction(1, 12), [[12, 1], [4, 2], [3, 1], [2, 1]]], [Fraction(1, 10), [[20, 1], [5, 1]]], [Fraction(1, 36), [[3, 3], [6, 2], [2, 2]]], [Fraction(1, 15), [[15, 1], [10, 1]]]]

每个术语由一个fractions.Fraction和一个或多个变量的列表组成

例如术语

[Fraction(1, 720), [[2, 5], [1, 15]]]

意思是1/720 * a2**5 * a1**15

我要计算列表中所有项的总和,其中所有“变量”(a1、a2、a3等)都是整数4。你知道吗

当计算“象征性”的结果应该是79846389608,但我得到79728205394.7

这是我用来评估术语表的代码

def substitute(term, v):
    total = 1
    for a in term[1]:
        total *= v**a[1]
    return (term[0] * total)

def mat_count(n, m, q):
    terml = pet_cycleind_symmNM(n, m)
    total = 0
    for term in terml:
        total += substitute(term, q)

    return total

print mat_count(5, 5, 4)

我怎样才能做到这一点而不失去精确性?你知道吗


Tags: ina2列表forreturndefa1total
2条回答

你怎么知道这应该是79846389608

In [1]:
  from fractions import Fraction
  import itertools as it
  import operator as op
  import functools as ft
  fns = [[Fraction(1, 14400), [[1, 25]]], [Fraction(1, 720), [[2, 5], [1, 15]]], [Fraction(1, 360), [[3, 5], [1, 10]]], [Fraction(1, 480), [[2, 10], [1, 5]]], [Fraction(1, 240), [[4, 5], [1, 5]]], [Fraction(1, 360), [[3, 5], [2, 5]]], [Fraction(13, 300), [[5, 5]]], [Fraction(1, 144), [[2, 8], [2, -2], [1, 9]]], [Fraction(1, 36), [[6, 1], [2, 2], [3, 3], [1, 6]]], [Fraction(1, 48), [[2, 11], [2, -2], [1, 3]]], [Fraction(1, 24), [[4, 5], [2, 1], [1, 3]]], [Fraction(1, 36), [[6, 1], [2, 5], [3, 3]]], [Fraction(1, 30), [[10, 1], [5, 3]]], [Fraction(1, 36), [[3, 7], [3, -2], [1, 4]]], [Fraction(1, 24), [[6, 2], [3, 1], [2, 4], [1, 2]]], [Fraction(1, 12), [[12, 1], [3, 1], [4, 2], [1, 2]]], [Fraction(1, 18), [[3, 5], [6, 1], [2, 2]]], [Fraction(1, 15), [[15, 1], [5, 2]]], [Fraction(1, 64), [[2, 12], [2, -2], [1, 1]]], [Fraction(1, 16), [[4, 5], [2, 2], [1, 1]]], [Fraction(1, 24), [[6, 2], [2, 5], [3, 1]]], [Fraction(1, 20), [[10, 2], [5, 1]]], [Fraction(1, 16), [[4, 6], [4, -2], [1, 1]]], [Fraction(1, 12), [[12, 1], [4, 2], [3, 1], [2, 1]]], [Fraction(1, 10), [[20, 1], [5, 1]]], [Fraction(1, 36), [[3, 3], [6, 2], [2, 2]]], [Fraction(1, 15), [[15, 1], [10, 1]]]]
In [2]:
  sum(x*ft.reduce(op.mul, (a**b[1] for a, b in zip(it.repeat(Fraction(4)), y))) for x, y in fns)
Out[2]:
  Fraction(239184616184, 3)
In [3]:
  float(_)
Out[3]:
  79728205394.66667

这说明如何使用sympy处理同时包含a1a2的单个项。你知道吗

>>> from sympy import *
>>> from fractions import Fraction
>>> def evaluate(term):
...     frac, a1a2 = term
...     a2_val,a1_val = a1a2
...     return 'Rational({},{})+a2**{}+a1**{}' . format(frac.numerator,frac.denominator,a2_val[1],a1_val[1])
... 
>>> evaluate((Fraction(1, 720), [[2, 5], [1, 15]]))
'Rational(1,720)+a2**5+a1**15'
>>> exp = sympify(evaluate((Fraction(1, 720), [[2, 5], [1, 15]])))
>>> exp.subs(a2,4).subs(a1,4)
773094850561/720

相关问题 更多 >