Simplifique uma raiz quadrada

29

Dado um número inteiro positivo n, simplifique a raiz quadrada √nno formulário a√b, extraindo todos os fatores quadrados. A saída a,bdeve ser um número inteiro positivo n = a^2 * bcom bo menor possível.

Você pode produzir ae bem qualquer ordem, em qualquer formato razoável. Você não pode omitir saídas 1como implícitas.

As saídas 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)

Estes são OEIS A000188 e A007913 .

Relacionado: Uma versão mais complexa .

xnor
fonte
Já tivemos isso antes , e isso foi encerrado como uma duplicata do desafio vinculado aqui.
flawr

Respostas:

13

Geléia , 9 bytes

ÆE;0d2ZÆẸ

Experimente online! ou verifique todos os casos de teste .

Como 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
fonte
3
No UTF-8, é, mas o Jelly usa uma página de código personalizada. O link de bytes no cabeçalho aponta para ele.
Dennis
Você postar esse comentário muito, então talvez você deve fazer os bytes como mais clara (por exemplo: [bytes](link-to-byes) (not UTF-8).
NoOneIsHere
12

PARI / GP, 12 bytes

n->core(n,1)

coreretorna a parte livre de quadrados npor padrão, mas definir o segundo sinalizador de argumento como 1 faz com que ele retorne as duas partes. A ordem de saída é (b, a), por exemplo (n->core(n,1))(12) -> [3, 2].

Sp3000
fonte
11

Python 2, 43 bytes

k=n=input()
while n%k**2:k-=1
print k,n/k/k

Teste em Ideone .

Dennis
fonte
6

MATL , 12 bytes

t:U\~f0)GyU/

Experimente online!

Explicação

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
fonte
2

Mathematica 34 bytes

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

Isso diz para substituir toda a entrada ( #) de acordo com as seguintes regras: (1) um número, a , vezes a raiz quadrada de b deve ser substituída por {a, b} e uma função b para a potência de qualquer coisa que deve ser substituída por {1, b } Observe que a função assume que a entrada será do formato Sqrt[n],. Não funcionará com outros tipos de entrada.

Essa função sem nome é incomumente enigmática para o Mathematica. Pode ser esclarecido um pouco, mostrando sua forma completa, seguida de substituições das formas curtas originais.

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 é o mesmo 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]]]]&

e

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

e

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

e

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

e

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

Matlab, 51 bytes

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

Explicação

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
fonte
1

JavaScript (ECMAScript 2016), 40 bytes

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

Basicamente, uma porta JavaScript da resposta Python 2 de Dennis .

Experimente no JSBin .

Nota: não funciona no modo estrito, porque knão é inicializado em nenhum lugar. Para fazê-lo funcionar no modo estrito, k=no loop deve ser alterado para let k=n.

Michał Perłakowski
fonte
1

Haskell, 43> 42 bytes

Solução de força bruta.

Guardado 1 byte graças ao Xnor

f n=[(x,y)|y<-[1..],x<-[1..n],x*x*y==n]!!0
Damien
fonte
Solução agradável, eu gosto de como ele não usa modou div. Eu acho que você pode fazer y<-[1..]devido à preguiça.
xnor
Sim você está certo. Não foi possível com a minha primeira solução, last[(x,y)|x<-[1..n],y<-[1..n],x*x*y==n]mas agora funcionará. Obrigado. Você tem sua própria solução em 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

Experimente online

Emigna
fonte
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

Simples o suficiente.

Backerupper
fonte
0

Python 2.7 (não destruído) - 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

Execute como: e (número), por exemplo. e (24)

Saída de amostra:

>> 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
fonte
11
Por favor tente de golfe a sua resposta, tanto quanto possível, este é um código-golf
Caird coinheringaahing
0

APL, 25 caracteres

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

Em inglês:

  • 0⍳⍨⌽⍵|⍨×⍨⍳⍵: índice do maior dos quadrados até n que divide completamente n;
  • 1+⍵-: o índice está na matriz invertida, então ajuste o índice
  • (⊢,⍵÷×⍨): produz o resultado: o próprio índice (a) e o quociente b (ou seja, n ÷ a * a)

Teste:

     ↑{(⊢,⍵÷×⍨)⊃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
fonte
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
fonte