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()
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
我有一个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()
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