Répétez cette opération GCD


19

Le problème A3 du concours Putnam 2008 dit:

Commencez par une séquence finie d'entiers positifs. Si possible, choisissez deux indices tels que a_j ne divise pas a_k et remplacez a_j et a_k par \ gcd (a_j, a_k) et \ text {lcm} (a_j, a_k) , respectivement. Prouver que si ce processus se répète, il doit finalement s'arrêter et la séquence finale ne dépend pas des choix effectués.a1,a2,,anj<kajakajakgcd(aj,ak)lcm(aj,ak)

Votre objectif dans ce défi est de prendre une séquence finie d'entiers positifs en entrée et de produire le résultat de la répétition de ce processus jusqu'à ce qu'aucun autre progrès ne soit possible. (Autrement dit, jusqu'à ce que chaque nombre de la séquence résultante divise tous les nombres qui le suivent.) Vous n'avez pas besoin de résoudre le problème de Putnam.

C'est le : la solution la plus courte dans tous les langages de programmation l'emporte.

Cas de test

[1, 2, 4, 8, 16, 32] => [1, 2, 4, 8, 16, 32]
[120, 24, 6, 2, 1, 1] => [1, 1, 2, 6, 24, 120]
[97, 41, 48, 12, 98, 68] => [1, 1, 2, 4, 12, 159016368]
[225, 36, 30, 1125, 36, 18, 180] => [3, 9, 18, 90, 180, 900, 4500]
[17, 17, 17, 17] => [17, 17, 17, 17]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] => [1, 1, 1, 1, 1, 2, 2, 6, 60, 2520]

9
Quel joli problème! Écrivez chaque entier ai comme 2αi3βi5γi et notez que le processus trie simplement à bulles les listes α,β,γ, in parallèle :)
Lynn

Réponses:


12

Gelée , 9 octets

ÆEz0Ṣ€ZÆẸ

Essayez-le en ligne!

Comment ça fonctionne

ÆEz0Ṣ€ZÆẸ  Main link. Argument: A (array)

ÆE         For each n in A, compute the exponents of n's prime factorization.
           E.g., 2000000 = 2⁷3⁰5⁶ gets mapped to [7, 0, 6].
  z0       Zip 0; append 0's to shorter exponent arrays to pad them to the same
           length, then read the resulting matrix by columns.
    Ṣ€     Sort the resulting arrays (exponents that correspond to the same prime).
      Z    Zip; read the resulting matrix by columns, re-grouping the exponents by
           the integers they represent.
       ÆẸ  Unexponents; map the exponent arrays back to integers.


5

J , 17 octets

/:~"1&.|:&.(_&q:)

Essayez-le en ligne!

Probablement la première réponse J sur PPCG à utiliser &.deux fois. Après ceci et cela , je commence à me sentir comme un pirate informatique étrange.

Fondamentalement, une traduction de la réponse de Dennis 'Jelly .

Comment ça fonctionne

/:~"1&.|:&.(_&q:)  Single monadic verb.
           (_&q:)  Convert each number to prime exponents
                   (automatically zero-filled to the right)
       |:&.        Transpose
/:~"1&.            Sort each row in increasing order
       |:&.        Transpose again (inverse of transpose == transpose)
           (_&q:)  Apply inverse of prime exponents; convert back to integers

Un plus tôt est ici
FrownyFrog

5

Wolfram Language (Mathematica) , 44 octets

Table[GCD@@LCM@@@#~Subsets~{i},{i,Tr[1^#]}]&

Le ème élément du résultat est le GCD des LCM des sous-ensembles avec éléments.kk

bk=gcd({lcm(ai1,,aik)|1i1<<ikn})

Essayez-le en ligne!


Très agréable! Vous êtes deux pour deux sur des approches étranges que je n'ai pas vues venir :)
Misha Lavrov

5

Python 3 , 103 octets

import math
def f(a,i=0,j=-1):d=math.gcd(a[i],a[j]);a[j]*=a[i]//d;a[i]=d;a[i:j]and f(a,i,j-1)==f(a,i+1)

Essayez-le en ligne!

Explication

Ce problème est essentiellement une sorte parallèle sur les facteurs premiers, et (pgcd (a, b), ppcm (a, b)) est analogue à (min (a, b), max (a, b)). Parlons donc en termes de tri.

Nous prouverons par induction qu'après f (i, j), a [i] devient la plus petite valeur dans (l'ancienne valeur de) L, où L est la plage entre a [i] et a [j], y compris les deux extrémités . Et si j = -1, f (i, j) triera la plage L.

Le cas où L contient un élément est trivial. Pour la première revendication, notez que le plus petit de L ne peut pas rester dans un [j] après l'échange, donc f (i, j-1) le mettra dans un [i], et f (i + 1, - 1) ne l'affectera pas.

Pour la deuxième revendication, notez que a [i] est la plus petite valeur, et f (i + 1, -1) triera les valeurs restantes, donc L devient trié après f (i, j).


3

Rétine , 65 octets

\d+
*
+`\b((_+)(\2)+)\b(.*)\b(?!\1+\b)(\2+)\b
$2$4$5$#3*$5
_+
$.&

Essayez-le en ligne! Link inclut les cas de test les plus rapides. Explication:

\d+
*

Convertissez en unaire.

+`\b((_+)(\2)+)\b(.*)\b(?!\1+\b)(\2+)\b

Correspondance répétée: tout nombre avec un facteur, puis un nombre ultérieur qui n'est pas divisible par le premier nombre mais qui est divisible par le facteur.

$2$4$5$#3*$5

$1est le premier nombre. $2est le facteur. Parce que l'expression régulière est gourmande, c'est le plus grand facteur, c'est-à-dire le pgcd. $4est la partie de la correspondance entre les numéros d'origine. $5est le deuxième nombre. $#3(en décimal plutôt qu'en unaire) est un de moins que $1divisé par $2, car il n'inclut pas l'original $2. Cela signifie que pour calculer le lcm, nous devons multiplier $5par un de plus $#3ce qui est le plus succinctement écrit comme la somme de $5et le produit de $#3et $5.

_+
$.&

Convertissez en décimal.


Unary est autorisé par défaut pour Retina , vous pouvez donc compter cela comme 52 octets.
Dennis

@Dennis Seules trois de mes réponses sur la rétine sont entrées en unaire; Je me suis habitué à faire des E / S en décimal.
Neil

3

05AB1E , 10 octets

Le mérite de l'approche revient aux alephalpha .

εIæN>ù€.¿¿

Essayez-le en ligne!

εIæN>ù€.¿¿     Full program. Takes a list from STDIN, outputs another one to STDOUT.
ε              Execute for each element of the input, with N as the index variable.
 Iæ            Powerset of the input.
   N>ù         Only keep the elements of length N+1.
      €.¿      LCM each.
         ¿     Take the GCD of LCMs.


2

JavaScript (SpiderMonkey) , 69 octets

a=>a.map((q,i)=>a.map(l=(p,j)=>a[j]=j>i&&(t=p%q)?p/t*l(q,j,q=t):p)|q)

Essayez-le en ligne!

  • La fonction laffectée lcm(p,q)à a[j]et affectée gcd(p, q)à qif j > i, sinon, tout reste inchangé.
    • lcm(p,q) = if p%q=0 then p else p*lcm(q,p%q)/(p%q)

Ancienne réponse:

JavaScript (SpiderMonkey) , 73 octets

a=>a.map((u,i)=>a.map((v,j)=>i<j?a[j]*=u/(g=p=>p%u?g(u,u=p%u):u)(v):0)|u)

Essayez-le en ligne!

  • La fonction gcalcule gcd(u, v)et affecte une valeur de retour à u.

2

05AB1E , 15 14 13 octets

Ó¾ζ€{øεgÅpymP

Port de @ Dennis ♦ 'Réponse de Jelly , mais malheureusement 05AB1E n'a pas de module intégré Unxponents, donc cela prend plus de la moitié du programme .. :(
-1 octet grâce à @ Mr.Xcoder .
-1 octet grâce à @Enigma .

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

Explication:

Ó          # Prime exponents of the (implicit) input-list
 ¾ζ        # Zip, swapping rows and columns, with integer 0 as filler
   €{      # Sort each inner list
     ø     # Zip, swapping rows and columns again
ε          # Map each inner list:
 gÅp       #  Get the first `l` primes, where `l` is the size of the inner list
    ym     #  Take the power of the prime-list and inner list
      P    #  And then take the product of that result
           # (And output implicitly)

1
Oh, je n'avais pas vu votre réponse avant de poster la mienne, lol. 14 octets en utilisant ¾et en supprimant , +1. (J'ai déjà essayé cela parce que j'ai essayé de porter la réponse de Dennis aussi lol)
M. Xcoder

1
L'utilisation εgÅpymPéconomiserait un autre octet sur celui mentionné par M. Xcoder
Emigna

@ Mr.Xcoder Oh, je ne savais pas qu'il y avait une différence entre le remplissage avec 0et ¾. Besoin de vous en souvenir! En fait, je vais l'ajouter à mes petits conseils 05AB1E dès maintenant. :)
Kevin Cruijssen
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.