Factorisation mutuelle maximale


14

Définitions

  • Deux nombres sont co-premiers si leur seul diviseur commun positif est 1.
  • Une liste de nombres est co-amorcée mutuellement si chaque paire de nombres de cette liste est co-amorcée les unes avec les autres.
  • Une factorisation de nombre nest une liste de nombres dont le produit est n.

Tâche

Étant donné un nombre positif n, sortez la factorisation mutuellement co-prime de navec la longueur maximale qui ne comprend pas 1.

Exemple

Car n=60, la réponse est [3,4,5], car 3*4*5=60et aucune autre factorisation mutuellement co-prime sans 1a une longueur supérieure ou égale à 3, la longueur de la factorisation.

Règles et libertés

  • Vous pouvez utiliser n'importe quel format d'entrée / sortie raisonnable.
  • Les entrées de la liste de sortie n'ont pas besoin d'être triées.

Cas de test

n   output
1   []
2   [2]
3   [3]
4   [4]
5   [5]
6   [2, 3]
7   [7]
8   [8]
9   [9]
10  [2, 5]
11  [11]
12  [3, 4]
13  [13]
14  [2, 7]
15  [3, 5]
16  [16]
17  [17]
18  [2, 9]
19  [19]
20  [4, 5]
21  [3, 7]
22  [2, 11]
23  [23]
24  [3, 8]
25  [25]
26  [2, 13]
27  [27]
28  [4, 7]
29  [29]
30  [2, 3, 5]
31  [31]
32  [32]
33  [3, 11]
34  [2, 17]
35  [5, 7]
36  [4, 9]
37  [37]
38  [2, 19]
39  [3, 13]
40  [5, 8]
41  [41]
42  [2, 3, 7]
43  [43]
44  [4, 11]
45  [5, 9]
46  [2, 23]
47  [47]
48  [3, 16]
49  [49]
50  [2, 25]
51  [3, 17]
52  [4, 13]
53  [53]
54  [2, 27]
55  [5, 11]
56  [7, 8]
57  [3, 19]
58  [2, 29]
59  [59]
60  [3, 4, 5]
61  [61]
62  [2, 31]
63  [7, 9]
64  [64]
65  [5, 13]
66  [2, 3, 11]
67  [67]
68  [4, 17]
69  [3, 23]
70  [2, 5, 7]
71  [71]
72  [8, 9]
73  [73]
74  [2, 37]
75  [3, 25]
76  [4, 19]
77  [7, 11]
78  [2, 3, 13]
79  [79]
80  [5, 16]
81  [81]
82  [2, 41]
83  [83]
84  [3, 4, 7]
85  [5, 17]
86  [2, 43]
87  [3, 29]
88  [8, 11]
89  [89]
90  [2, 5, 9]
91  [7, 13]
92  [4, 23]
93  [3, 31]
94  [2, 47]
95  [5, 19]
96  [3, 32]
97  [97]
98  [2, 49]
99  [9, 11]

Notation

C'est du . La réponse la plus courte en octets l'emporte.




Un défi de suivi plus difficile: seules les paires adjacentes dans la liste résultante doivent être co-amorcées.
Martin Ender

4
S'agit-il simplement d'une factorisation en pouvoirs principaux?
Paŭlo Ebermann

1
@ PaŭloEbermann oui, ça l'est.
Leaky Nun

Réponses:



9

Brachylog , 4 octets

ḋḅ×ᵐ

Essayez-le en ligne!

Explication

       # output is the list of
  ×ᵐ   # products of each
 ḅ     # block of consecutive equal elements
ḋ      # of the prime factors
       # of the input

2
Félicitations pour votre première réponse Brachylog! ... au moins je pense?
Fatalize

1
@Fatalize: Mon 2e je pense. J'avais celui-là d'avant. Certainement mon plus court cependant :)
Emigna

5

05AB1E , 3 5 octets

+2 octets pour corriger le cas de bord de 1. Merci à Riley pour le patch (et pour la suite de tests, mon 05ab1e n'est pas si fort!)

ÒγP1K

Suite de tests sur Try it online!

Comment?

Ò     - prime factorisation, with duplicates
 γ    - split into chunks of consecutive equal elements
  P   - product of each list
   1  - literal one
    K - removed instances of top from previous
      - implicitly display top of stack

@Adnan est-ce le meilleur lien pour les "octets" ou existe-t-il une page de codes formatée quelque part?
Jonathan Allan

Oui, il y a une page de code qui affiche tous les octets.
Adnan

1
Oh, comment ça m'a manqué> _ <Merci infiniment :)
Jonathan Allan

Ne fonctionne pas pour 1.
Leaky Nun

@LeakyNun corrigé avec de l'aide :)
Jonathan Allan


3

Haskell , 51 octets

(2#) est une fonction anonyme prenant un entier et renvoyant une liste.

Utiliser comme (2#) 99.

m#n|m>n=[]|x<-gcd(m^n)n=[x|x>1]++(m+1)#div n x
(2#)

Essayez-le en ligne!

Inspiré par le truc de pouvoir que certaines personnes ont utilisé dans le récent défi du nombre sans carré .

  • m#ngénère des facteurs de n, en commençant par m.
  • Si m>n, nous nous arrêtons, en concluant que nous avons déjà trouvé tous les facteurs.
  • x=gcd(m^n)nest le plus grand facteur ndont les facteurs premiers sont tous inclus m. Notez que parce que les plus petits msont testés en premier, ce sera 1sauf si mest premier.
  • Nous incluons xdans la liste résultante si ce n'est pas 1, puis récapitulons avec la suivante m, en divisant npar x. Notez que xet div n xne peuvent pas avoir de facteurs communs.
  • (2#)prend un nombre et commence à trouver ses facteurs 2.

3

MATL , 7 octets

&YF^1X-

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

Explication

Considérez la saisie 80 comme exemple.

&YF    % Implicit input. Push array of unique prime factors and array of exponents
       % STACK: [2 3 5], [4 0 1]
^      % Power, element-wise
       % STACK: [16 1 5]
1      % Push 1
       % STACK: [16 1 5], 1
X-     % Set difference, keeping order. Implicitly display
       % STACK: [16 5]

EDIT (9 juin 2017): YFavec deux sorties a été modifié dans la version 20.1.0 : les nombres premiers non facteurs et leurs exposants (zéro) sont ignorés. Cela n'affecte pas le code ci-dessus, qui fonctionne sans nécessiter de modifications (mais 1X-pourrait être supprimé).


Je suppose que le changement 1X-est redondant dans la nouvelle version ... aussi, cela ressemble à une différence définie plutôt qu'à une intersection pour moi.
Ørjan Johansen

@ ØrjanJohansen Correct sur les deux. Merci!
Luis Mendo

2

Gelée , 5 octets

ÆF*/€

Suite de tests sur Try it online!

Comment?

ÆF*/€ - Main link: n
ÆF    - prime factors as [prime, exponent] pairs
   /€ - reduce €ach with:
  *   - exponentiation

Une solution de 6 octets alternatif pour tenter de trouver une autre méthode qui lierait avec le vôtre (malheureusement défaut): ÆfŒgZP. Il a le même nombre de jetons mais trop d'atomes de deux octets;)
HyperNeutrino

... et comme mon entrée 05ab1e supprimée, elle revient 1pour une entrée 1qui est interdite (l'effet de l'exécution d'un produit vide).
Jonathan Allan

:( Eh bien, oups, ignoré cela. Darn.: P
HyperNeutrino

2

Alice , 10 octets

Ifw.n$@EOK

Essayez-le en ligne!

Malheureusement, cela utilise à nouveau les points de code comme des E / S entières . Le cas de test dans la liaison TIO est l'entrée 191808 qui se décompose en 64 , 81 et 37 . Notez que cette solution imprime les puissances premières dans l'ordre du plus grand au plus petit premier, donc nous obtenons la sortie %Q@.

Pour plus de commodité, voici une solution de 16 octets avec des E / S décimales qui utilise le même algorithme de base:

/O/\K
\i>fw.n$@E

Essayez-le en ligne!

Explication

Comme les autres réponses, cela décompose l'entrée en puissances principales.

I      Read a code point as input.
f      Compute its prime factorisation a prime/exponent pairs and push them
       to the stack in order from smallest to largest prime.
w      Remember the current IP position on the return address stack. This
       starts a loop.
  .      Duplicate the current exponent. This will be zero once all primes
         have been processed.
  n$@    Terminate the program if this was zero.
  E      Raise the prime to its corresponding power.
  O      Output the result as a character.
K      Return to the w to run the next loop iteration.

2

mathématique 46 octets

#[[1]]^#[[2]]&/@If[#==1,#={},FactorInteger@#]&

Essayez-le en ligne!


Bonne réponse, mais cela donne une sortie légèrement incorrecte pour certains des cas de test. Actuellement, votre code sort {}; {2}; {3}; {2}; {5}; {2,3}; {7}; {2}; {3}; {2,5}; {11}; {2,3}; {13}; ... mais il devrait {}; {2}; {3}; {4}; {5}; {2,3}; {7}; {8}; {9}; {2,5}; {11}; {4,3}; {13}; ...plutôt sortir .
Kevin Cruijssen

Je pense que je l'ai corrigé
J42161217

Semble effectivement travailler à TIO . +1 Oh, et bienvenue à PPCG, je vois que vous êtes assez nouveau ici. Vous l'avez probablement déjà vu, mais sinon, les conseils pour jouer au golf dans Mathematica pourraient être intéressants à lire. Profitez de votre séjour! :)
Kevin Cruijssen

1
Si vous vous retrouvez à accéder aux composants de #plus que #lui-même, vous pouvez économiser beaucoup d'octets en utilisant Apply( @@@) au lieu de Map( /@):#^#2&@@@If...
Martin Ender

1

PHP, 62 octets

imprime un tableau associatif avec le premier comme clé et à quelle fréquence le premier est utilisé comme valeur et rien pour l'entrée 1

for($i=2;1<$n=&$argn;)$n%$i?++$i:$n/=$i+!++$r[$i];print_r($r);

Essayez-le en ligne!

Sortie pour 60

Array
(
    [2] => 2
    [3] => 1
    [5] => 1
)

PHP, 82 octets

for($i=2;1<$n=&$argn;)$n%$i?++$i:$n/=$i+!($r[$i]=$r[$i]?$r[$i]*$i:$i);print_r($r);

Essayez-le en ligne!

n'imprime rien pour la saisie 1si vous souhaitez un tableau vide à la place et un tableau trié ce sera un peu plus long

for($r=[],$i=2;1<$n=&$argn;)$n%$i?++$i:$n/=$i+!($r[$i]=$r[$i]?$r[$i]*$i:$i);sort($r);print_r($r);



0

miniML , 47 octets

Les défis impliquant la factorisation principale sont terriblement surreprésentés ici, donc nous sommes tous malheureusement obligés d'avoir la factorisation dans la bibliothèque standard.

fun n->map(fun p->ipow(fst p)(snd p))(factor n)

Notez que le «mini» dans miniml fait référence à la taille de l'ensemble de fonctionnalités, et non à la taille du code source qui y est écrit.


0

Rubis, 61 octets

require 'prime'
->n{(2..n).select{|e|n/e.to_f%1==0&&e.prime?}}

Je suis vraiment déçu après avoir cherché des solutions de 6 à 7 octets -))


0

Mathematica, 24 octets

Power@@@FactorInteger@#&

Dommage @@@*n'est pas une chose. De plus, je voudrais /@*, @@*et en fait, le changement @@@à /@@, //@à @@@ou autre chose et ajouter la famille infinie de //@, ///@...

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.