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 .


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.

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].


11

Python 2, 43 octets

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

Testez-le sur Ideone .


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


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}}] &


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

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.


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

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


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.


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)

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

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]

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.