Simplifiez une racine carrée

29

Étant donné un entier positif n, simplifiez la racine carrée √ndans le formulaire a√ben extrayant tous les facteurs carrés. Les sorties a,bdoivent être des entiers positifs n = a^2 * bavec le bplus petit possible.

Vous pouvez sortir aet bdans n'importe quel ordre dans n'importe quel format raisonnable. Vous ne pouvez pas omettre les sorties de 1comme implicites.

Les sorties pour n=1..36comme (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)

Ce sont les OEIS A000188 et A007913 .

Connexes: une version plus complexe .

xnor
la source
Nous avons eu cela auparavant , et cela a été fermé en tant que double du défi lié ici.
flawr

Réponses:

13

Gelée , 9 octets

ÆE;0d2ZÆẸ

Essayez-le en ligne! ou vérifiez tous les cas de test .

Comment ça marche

Æ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
la source
3
En UTF-8, c'est le cas, mais Jelly utilise une page de codes personnalisée. Le lien octets dans l'en-tête pointe vers lui.
Dennis
Vous postez ce commentaire beaucoup, vous devriez peut - être faire les octets comme plus clairs (par exemple: [bytes](link-to-byes) (not UTF-8).
NoOneIsHere
12

PARI / GP, 12 octets

n->core(n,1)

corerenvoie la partie sans carré de npar défaut, mais en définissant le deuxième indicateur d'argument sur 1, il renvoie les deux parties. L'ordre de sortie est (b, a), par exemple (n->core(n,1))(12) -> [3, 2].

Sp3000
la source
11

Python 2, 43 octets

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

Testez-le sur Ideone .

Dennis
la source
6

MATL , 12 octets

t:U\~f0)GyU/

Essayez-le en ligne!

Explication

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
la source
2

Mathematica 34 octets

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

Cela dit de remplacer toutes les entrées ( #) selon les règles suivantes: (1) un nombre, a , fois la racine carrée de b doit être remplacé par {a, b} et une fonction b à la puissance de tout ce qui doit être remplacé par {1, b }. Notez que la fonction suppose que l'entrée sera de la forme Sqrt[n],. Cela ne fonctionnera pas avec d'autres types d'entrée.

Cette fonction sans nom est inhabituellement cryptique pour Mathematica. Il peut être quelque peu clarifié en montrant sa forme complète, suivie par le remplacement des formes plus courtes 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]]]]]

ce qui est le même 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]]]]&

et

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

et

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

et

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

et

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

Matlab, 51 octets

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

Explication

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
la source
1

JavaScript (ECMAScript 2016), 40 octets

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

Fondamentalement, un port JavaScript de la réponse Python 2 de Dennis .

Essayez-le sur JSBin .

Remarque: cela ne fonctionne pas en mode strict, car il kn'est initialisé nulle part. Pour le faire fonctionner en mode strict, k=nla boucle doit être remplacée par let k=n.

Michał Perłakowski
la source
1

Haskell, 43> 42 octets

Solution de force brute.

1 octet enregistré grâce à Xnor

f n=[(x,y)|y<-[1..],x<-[1..n],x*x*y==n]!!0
Damien
la source
Belle solution, j'aime la façon dont il n'utilise pas modou div. Je pense que vous pouvez le faire en y<-[1..]raison de la paresse.
xnor
Oui, tu as raison. Ce n'était pas possible avec ma première solution last[(x,y)|x<-[1..n],y<-[1..n],x*x*y==n]mais maintenant ça va marcher. Merci. Avez-vous votre propre solution à Haskell?
Damien
1

05AB1E, 14 octets

Lv¹ynÖi¹yn/y‚ï

Expliqué

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

Essayez-le en ligne

Emigna
la source
1

Python, 74 octets

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

Assez simple.

Backerupper
la source
0

Python 2.7 (non golfé) - 181 octets

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

Exécuter comme: e (nombre) par exemple. e (24)

Exemple de sortie:

>> 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
la source
1
Veuillez essayer de
jouer
0

APL, 25 caractères

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

En anglais:

  • 0⍳⍨⌽⍵|⍨×⍨⍳⍵: indice du plus grand des carrés jusqu'à n qui divise complètement n;
  • 1+⍵-: l'index est dans le tableau inversé, ajustez donc l'index
  • (⊢,⍵÷×⍨): produit le résultat: l'indice lui-même (a) et le quotient b (c'est-à-dire, n ÷ a * a)

Tester:

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

JavaScript (ECMAScript 6), 35 octets

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
la source