Tengo una pregunta de matemáticas/python, ¿cómo cambiar un número grande en raíz cuadrada a un número pequeño (pero manteniendo el valor), por ejemplo, √243 a 9√3?
Y tengo otra pregunta, ¿cómo usarlo en mi código?
Código:
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()La forma en que pensé en esto es que podemos eliminar recursivamente factores cuadrados de la raíz.
p.ej
243 / \ 3^2 27 / \ 3^2 3El resultado final a la derecha (es decir, 3) será la raíz simplificada, ya que eliminamos todos los factores cuadrados. Los números de la izquierda (3 * 3 == 9) serán los que le saquemos de raíz.
Primero, necesitamos una forma de saber si un número es cuadrado. De otra pregunta :
import math def is_square(i: int) -> bool: return i == math.isqrt(i) ** 2A continuación, necesitamos poder determinar los factores de un número. Reuní algo rudimentario aquí, aunque ciertamente se puede hacer más eficiente (mejores ejemplos aquí ):
def factors(i: int) -> list[int]: factors = [] for number in range(1, i + 1): if i % number == 0: factors.append(number) return factorsAhora, podemos generar los factores de un número que son cuadrados:
>>> [a for a in factors(20) if is_square(a)] [1, 4]Poniendo todo esto junto, podemos generar el número fuera de la raíz cuadrada. Nuestro caso base es cuando la raíz ya está simplificada. Esto significa que su único factor cuadrado es 1.
De lo contrario, generamos cuál debería ser el número exterior después de eliminar un factor, y seguimos repitiendo este proceso.
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 eg 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 5Finalmente, necesitamos generar el número dentro de la raíz. por ejemplo, si su número exterior es 3, dividimos el número original por 3^2 == 9 para obtener la raíz simplificada.
def inside(i: int) -> int: return i // (outside(i) ** 2) >>> inside(20) >>> 5 # 2 sqrt 5 >>> inside(243) >>> 3 # 9 sqrt 3Juntando todo esto:
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 5Podrías encontrar la raíz más grande que sea un divisor de tu número y presentar el resto como la parte √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)) # √97Por lo general, es mejor separar los cálculos del formato utilizando dos funciones de un solo propósito:
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