Simplifica una raíz cuadrada

29

Dado un número entero positivo n, simplifique la raíz cuadrada √nen la forma a√bextrayendo todos los factores cuadrados. Los resultados a,bdeben ser enteros positivos n = a^2 * bcon el bmenor tamaño posible.

Puede imprimir ay ben cualquier orden en cualquier formato razonable. No puede omitir salidas 1como implícitas.

Las salidas para n=1..36como (a,b):

1 (1, 1)
2 (1, 2)
3 (1, 3)
4 (2, 1)
5 (1, 5)
6 (1, 6)
7 (1, 7)
8 (2, 2)
9 (3, 1)
10 (1, 10)
11 (1, 11)
12 (2, 3)
13 (1, 13)
14 (1, 14)
15 (1, 15)
16 (4, 1)
17 (1, 17)
18 (3, 2)
19 (1, 19)
20 (2, 5)
21 (1, 21)
22 (1, 22)
23 (1, 23)
24 (2, 6)
25 (5, 1)
26 (1, 26)
27 (3, 3)
28 (2, 7)
29 (1, 29)
30 (1, 30)
31 (1, 31)
32 (4, 2)
33 (1, 33)
34 (1, 34)
35 (1, 35)
36 (6, 1)

Estos son OEIS A000188 y A007913 .

Relacionado: Una versión más compleja .

xnor
fuente
Hemos tenido esto antes , y eso se cerró como un duplicado del desafío vinculado aquí.
flawr

Respuestas:

13

Jalea , 9 bytes

ÆE;0d2ZÆẸ

Pruébalo en línea! o verificar todos los casos de prueba .

Cómo funciona

ÆE;0d2ZÆẸ  Main link. Argument: n

ÆE         Exponents; generate the exponents of n's prime factorization.
  ;0       Append 0 since 1ÆE returns [].
    d2     Divmod by 2.
      Z    Zip/transpose to group quotients and remainders.
       ÆẸ  Unexponent; turn the exponents of prime factorizations into integers.
Dennis
fuente
3
En UTF-8, lo es, pero Jelly usa una página de códigos personalizada. El enlace de bytes en el encabezado apunta a él.
Dennis
Que publique el comentario mucho, así que tal vez debería hacer que los bytes como más clara (por ejemplo: [bytes](link-to-byes) (not UTF-8).
NoOneIsHere
12

PARI / GP, 12 bytes

n->core(n,1)

coredevuelve la parte de squarefree de nforma predeterminada, pero establecer el segundo indicador de argumento en 1 hace que devuelva ambas partes. El orden de salida es (b, a), por ejemplo (n->core(n,1))(12) -> [3, 2].

Sp3000
fuente
6

MATL , 12 bytes

t:U\~f0)GyU/

Pruébalo en línea!

Explicación

t     % Take input n implicitly. Duplicate
:U    % Push [1 4 9 ... n^2]
\~    % True for entries that divide the input
f0)   % Get (1-based) index of the last (i.e. largest) dividing number
G     % Push input again
y     % Duplicate index of largest dividing number
U     % Square to recover largest dividing number
/     % Divide input by that. Implicitly display stack
Luis Mendo
fuente
2

Mathematica 34 bytes

#/.{a_ b_^_:>{a, b},_[b_,_]:>{1,b}}&

Esto dice reemplazar toda la entrada ( #) de acuerdo con las siguientes reglas: (1) un número, a , multiplicado por la raíz cuadrada de b debe reemplazarse por {a, b} y una función b a la potencia de lo que sea que deba reemplazarse por {1, b }. Tenga en cuenta que la función asume que la entrada tendrá la forma Sqrt[n],. No funcionará con otros tipos de entrada.

Esta función sin nombre es inusualmente críptica para Mathematica. Puede aclararse un poco mostrando su forma completa, seguido de reemplazos de las formas más cortas originales.

Function[
   ReplaceAll[
      Slot[1],
      List[
         RuleDelayed[Times[Pattern[a,Blank[]],Power[Pattern[b,Blank[]],Blank[]]],List[a,b]],
         RuleDelayed[Blank[][Pattern[b,Blank[]],Blank[]],List[1,b]]]]]

que es lo mismo que

   ReplaceAll[
      #,
      List[
         RuleDelayed[Times[Pattern[a,Blank[]],Power[Pattern[b,Blank[]],Blank[]]],List[a,b]],
         RuleDelayed[Blank[][Pattern[b,Blank[]],Blank[]],List[1,b]]]]&

y

ReplaceAll[#, 
  List[RuleDelayed[
    Times[Pattern[a, Blank[]], 
     Power[Pattern[b, Blank[]], Blank[]]], {a, b}], 
   RuleDelayed[Blank[][Pattern[b, Blank[]], Blank[]], {1, b}]]] &

y

ReplaceAll[#, 
  List[RuleDelayed[Times[a_, Power[b_, _]], {a, b}], 
   RuleDelayed[Blank[][b_, _], {1, b}]]] &

y

ReplaceAll[#, {RuleDelayed[a_*b^_, {a, b}], RuleDelayed[_[b_, _], {1, b}]}]&

y

ReplaceAll[#, {a_*b^_ :> {a, b}, _[b_, _] :> {1, b}}] &
DavidC
fuente
1

Matlab, 51 bytes

x=input('');y=1:x;z=y(~rem(x,y.^2));a=z(end)
x/a^2

Explicación

x=input('')       -- takes input
y=1:x             -- numbers from 1 to x
z=y(~rem(x,y.^2)) -- numbers such that their squares divide x
a=z(end)          -- biggest such number (first part of output)
x/a^2             -- remaining part
pajonk
fuente
1

JavaScript (ECMAScript 2016), 40 bytes

n=>{for(k=n;n%k**2;k--);return[k,n/k/k]}

Básicamente, un puerto JavaScript de la respuesta Python 2 de Dennis .

Pruébalo en JSBin .

Nota: no funciona en modo estricto, porque kno se inicializa en ningún lado. Para que funcione en modo estricto, k=nen el bucle debe cambiarse a let k=n.

Michał Perłakowski
fuente
1

Haskell, 43> 42 bytes

Solución de fuerza bruta.

Guardado 1 byte gracias a Xnor

f n=[(x,y)|y<-[1..],x<-[1..n],x*x*y==n]!!0
Damien
fuente
Buena solución, me gusta cómo no usa modo div. Creo que puedes hacerlo y<-[1..]debido a la pereza.
xnor
Sí, tiene usted razón. No fue posible con mi primera solución, last[(x,y)|x<-[1..n],y<-[1..n],x*x*y==n]pero ahora funcionará. Gracias. ¿Tienes tu propia solución en Haskell?
Damien
1

05AB1E, 14 bytes

Lv¹ynÖi¹yn/y‚ï

Explicado

Lv              # for each x in range(1,N) inclusive
  ¹ynÖi         # if N % x^2 == 0
       ¹yn/y‚ï  # create [N/x^2,x] pairs, N=12 -> [12,1] [3,2]
                # implicitly output last found pair

Pruébalo en línea

Emigna
fuente
1

Python, 74 bytes

def e(k):a=filter(lambda x:k/x**2*x*x==k,range(k,0,-1))[0];return a,k/a**2

Lo suficientemente directo.

Backerupper
fuente
0

Python 2.7 (sin golf) - 181 Bytes

def e(n):   
 for x in range(1,n+1):
  r=(1,x)
  for i in range(1,x+1):
   l=i**.5
   for j in range(1,x+1): 
    if i*j==x and l%1==0 and j<r[1]:r=(int(l),j)                
  print x,r

Ejecutar como: e (número) ej. e (24)

Salida de muestra:

>> e(24)
1 (1, 1)
2 (1, 2)
3 (1, 3)
4 (2, 1)
5 (1, 5)
6 (1, 6)
7 (1, 7)
8 (2, 2)
9 (3, 1)
10 (1, 10)
11 (1, 11)
12 (2, 3)
13 (1, 13)
14 (1, 14)
15 (1, 15)
16 (4, 1)
17 (1, 17)
18 (3, 2)
19 (1, 19)
20 (2, 5)
21 (1, 21)
22 (1, 22)
23 (1, 23)
24 (2, 6)
Swadhikar C
fuente
1
Por favor, intente jugar su respuesta lo más posible, este es un código de golf
caird coinheringaahing
0

APL, 25 caracteres

 {(⊢,⍵÷×⍨)1+⍵-0⍳⍨⌽⍵|⍨×⍨⍳⍵}

En inglés:

  • 0⍳⍨⌽⍵|⍨×⍨⍳⍵: índice del mayor de los cuadrados hasta n que divide completamente n;
  • 1+⍵-: el índice está en la matriz invertida, así que ajuste el índice
  • (⊢,⍵÷×⍨): produce el resultado: el índice en sí (a) y el cociente b (es decir, n ÷ a * a)

Prueba:

     ↑{(⊢,⍵÷×⍨)⊃z/⍨0=⍵|⍨×⍨z←⌽⍳⍵}¨⍳36
1  1
1  2
1  3
2  1
1  5
1  6
1  7
2  2
3  1
1 10
1 11
2  3
1 13
1 14
1 15
4  1
1 17
3  2
1 19
2  5
1 21
1 22
1 23
2  6
5  1
1 26
3  3
2  7
1 29
1 30
1 31
4  2
1 33
1 34
1 35
6  1
lstefano
fuente
0

JavaScript (ECMAScript 6), 35 bytes

f=(n,k=n)=>n/k%k?f(n,--k):[k,n/k/k]

JavaScript 1+, 37 B

for(k=n=prompt();n/k%k;--k);[k,n/k/k]
l4m2
fuente