python中的√243怎么改成9√3?以及一般如何改变平方根?

How to change √243 to 9√3 in python? And how to change squared root generally?

我有一个math/python问题,如何将平方根中的大数变为小数(但仍保留值),例如√243变为9√3?

我还有一个问题,如何在我的代码中使用它?

代码:

import math
dl=int(input("Podaj długość: "))
c=input("Który bok: przypdl, przypkr, przec: ")
def find(x):
    global przypkr
    global przec
    global przypdl
    if c=="przec":
        przec=x
        przypkr=x/2
        przypdl=przypkr*math.sqrt(3)
    elif c=="przypkr":
        przypkr=x
        przypdl=x*math.sqrt(3)
        przec=x*2
    else:
        przypdl=x
        przypkr=x/math.sqrt(3)
        przec=przypkr*2
    print(f'przeciwprostokątna: {przec}, krótsza przyprostokątna: {przypkr}, dłuższa przyprostokątna: {przypdl} √{przypdl*przypdl}')
find(dl)

def obw():
    print(f'Obwód równa się: {przec + przypkr + przypdl} lub {przec + przypkr} + √{przypdl*przypdl}')

obw()

使用simplify from SymPy包:

Python 环境:pip install sympy

Anaconda 环境:conda install sympy

import sympy as sp

expr = sp.sqrt(243)
print(sp.simplify(expr))

输出:

9*sqrt(3)

我的想法是我们可以递归地从根中删除平方因子。

例如

        243
        / \
     3^2   27
          /  \
        3^2   3

右边的最终结果(即 3)将是简化的根,因为我们已经删除了所有平方因子。左边的数字(3 * 3 == 9)就是我们去掉根的数字。

首先,我们需要一种判断数字是否为平方数的方法。来自 another question:

import math

def is_square(i: int) -> bool:
    return i == math.isqrt(i) ** 2

接下来,我们需要能够确定一个数的因数。我在这里整理了一些粗鲁的东西,虽然它肯定可以变得更有效率(更好的例子here):

def factors(i: int) -> list[int]:
    factors = []
    for number in range(1, i + 1):
    if i % number == 0:
        factors.append(number)
    return factors

现在,我们可以生成平方数的因式:

>>> [a for a in factors(20) if is_square(a)]
[1, 4]

把这些放在一起,我们可以生成平方根以外的数字。我们的基本情况是根已经简化。这意味着它唯一的平方因子是 1.

否则,我们生成去掉一个因子后应该是外面的数,不断重复这个过程

def outside(i: int) -> int:
    square_factors = [a for a in factors(i) if is_square(a)]
    # Factors are sorted in increasing order.
    # Therefore, take any factor that's not 1
    factor = square_factors[-1]
    if factor == 1:
        return 1
    # Double slash usage e.g. 7.0 => 7. Could alternatively use int
    return int(math.sqrt(factor) * outside(i // factor))

>>> outside(243)
9  # 9 root 3
>>> outside(20)
2  # 2 root 5

最后,我们需要生成根内的数字。例如如果它的外数是3,我们将原数除以3^2 == 9得到简化的根。

def inside(i: int) -> int:
    return i // (outside(i) ** 2)

>>> inside(20)
>>> 5  # 2 sqrt 5

>>> inside(243)
>>> 3  # 9 sqrt 3

综合起来:

def simplify(i: int) -> tuple[int, int]:
    return outside(i), inside(i)

>>> simplify(243)
(9, 3)  # 9 sqrt 3
>>> simplify(10)
(1, 10)  # 1 sqrt 10
>>> simplify(20)
(2, 5)  # 2 sqrt 5

你可以找到你的数的约数的最大根,并将余数表示为√xxx部分:

def root(N):
    for r in range(int(N**0.5)+1,1,-1):
        if N % (r*r) == 0:
            n = N // (r*r)
            return str(r) + f"√{n}"*(n>1)
    return f"√{N}"

    
print(root(50)) # 5√2
print(root(81)) # 9
print(root(96)) # 4√6
print(root(97)) # √97

通常最好使用两个单一用途函数将计算与格式化分开:

def unroot(N): # find multiplier and remaining root
    m,d = 1,2
    while d*d<=N:
        if N % (d*d): d  += 1 + d%2
        else:         m,N = m*d,N//(d*d)
    return m,N

def rootstr(N):     # format into a string
    m,n = unroot(N)
    return str(m)*(m>1)+f"√{n}"*(n>1)


for N in (50,81,96,97):
    print(f"√{N} =",rootstr(N))

√50 = 5√2
√81 = 9
√96 = 4√6
√97 = √97