Un entier gaussien est un nombre complexe dont les parties réelle et imaginaire sont des entiers.
Les entiers gaussiens, comme les entiers ordinaires, peuvent être représentés comme un produit de nombres premiers gaussiens, d'une manière unique. Le défi ici est de calculer les constituants premiers d'un entier gaussien donné.
Entrée: un entier gaussien, qui n'est pas égal à 0 et n'est pas une unité (c.-à-d. 1, -1, i et -i ne peuvent pas être donnés comme entrées). Utilisez n'importe quel format raisonnable, par exemple:
- 4-5i
- -5 * j + 4
- (4, -5)
Sortie: une liste d'entiers gaussiens, qui sont premiers (c'est-à-dire qu'aucun d'eux ne peut être représenté comme un produit de deux entiers gaussiens non unitaires), et dont le produit est égal au nombre d'entrée. Tous les nombres dans la liste de sortie doivent être non triviaux, c'est-à-dire pas 1, -1, i ou -i. Tout format de sortie raisonnable peut être utilisé; il ne doit pas nécessairement être le même que le format d'entrée.
Si la liste des sorties contient plus d'un élément, plusieurs sorties correctes sont possibles. Par exemple, pour l'entrée 9, la sortie peut être [3, 3] ou [-3, -3] ou [3i, -3i] ou [-3i, 3i].
Cas de test, (tirés de ce tableau ; 2 lignes par cas de test)
2
1+i, 1-i
3i
3i
256
1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i
7+9i
1+i,2−i,3+2i
27+15i
1+i,3,7−2i
6840+585i
-1-2i, 1+4i, 2+i, 3, 3, 6+i, 6+i
Les fonctions intégrées de factorisation des entiers gaussiens ne sont pas autorisées. La factorisation d'entiers ordinaires par des fonctions intégrées est cependant autorisée.
la source
3i
revenir en tant que3,i
, ou3i
?3i
est la bonne réponse car cei
n'est pas un premier choix. J'ai mis à jour le cas de test pour le rendre plus clair.6840+585i
n'a pas la bonne liste de facteurs, comme ce5
n'est pas un nombre premier gaussien. Au lieu de cela, il revient-1-2i, 1+4i, 2+i, 3, 3, 6+i, 6+i
. Source256=(1+i)**16
pas(1+i)**8
parce que256=2**8=(2i)**8
et2i=(1+i)**2
Réponses:
Gelée ,
6155 octetsEssayez-le en ligne! (En-tête et pied de page formate la sortie)
-6 octets grâce à @EricTheOutgolfer
Comment ça marche
la source
Rubis ,
258256249246 + 8 =264257254 octetsUtilise le
-rprime
drapeau.Décidément, quel gâchis.
Utilise cet algorithme de stackoverflow.
Essayez-le en ligne!
la source
Python 2 ,
250239223215 octetsEssayez-le en ligne!
(a,b)
Quelques explications décomposent récursivement un complexe en deux complexes jusqu'à ce qu'aucune décomposition ne soit possible ...
la source
def f(Z,s=[])
devrait vous faire économiser un personnageRouille - 212 octets
Je ne suis pas sûr à 100% si cela fonctionne à 100%, mais cela semble correct pour une large gamme de tests. Ce n'est pas plus petit que Jelly, mais au moins c'est plus petit que les langages interprétés (jusqu'à présent). Il semble également être plus rapide et peut fonctionner grâce à des entrées d'un milliard de magnitude en moins d'une seconde. Par exemple 1234567890 + 3141592650i facteurs comme (-9487 + 7990i) (- 1 + -1i) (- 395 + 336i) (2 + -1i) (1 + 1i) (3 + 0i) (3 + 0i) (4+ 1i) (- 1 + 1i) (- 1 + 2i), (cliquez ici pour tester sur wolfram alpha)
Cela a commencé comme la même idée que la factorisation naïve des nombres entiers, pour parcourir chaque nombre en dessous de l'entier en question, voir s'il se divise, répéter jusqu'à ce que cela soit fait. Puis, inspiré par d'autres réponses, il s'est transformé ... il factorise à plusieurs reprises des éléments dans un vecteur. Il le fait un bon nombre de fois, mais pas jusqu'à ce que quoi que ce soit. Le nombre d'itérations a été choisi pour couvrir une bonne partie des entrées raisonnables.
Il utilise toujours "(a mod b) == 0" pour tester si un entier en divise un autre (pour les gaussiens, nous utilisons le modulo gaussien intégré de Rust, et considérons "0" comme la norme == 0), cependant la vérification de 'norm ( a / b)! = 1 'empêche de diviser "trop", ce qui permet essentiellement de remplir le vecteur résultant avec uniquement des nombres premiers, mais de ne ramener aucun élément du vecteur à l'unité (0-i, 0 + i, -1 + 0i, 1 + 0i) (ce qui est interdit par la question).
Les limites pour la boucle ont été trouvées par expérience. y passe de 1 vers le haut pour éviter les paniques de division par zéro, et x peut passer de -999 à 0 grâce à la mise en miroir des Gaussiens sur les quadrants (je pense?). En ce qui concerne les limitations, la question d'origine n'indiquait pas une plage valide d'entrées / sorties, donc une "taille d'entrée raisonnable" est supposée ... (Edit ... cependant je ne sais pas exactement comment calculer à quel nombre cela va commencent à "échouer", j'imagine qu'il y a des entiers gaussiens qui ne sont pas divisibles par quoi que ce soit en dessous de 999 mais qui sont encore étonnamment petits pour moi)
Essayez la version quelque peu non golfée sur play.rust-lang.org
la source
Perl 6 ,
141124 octetsMerci à Jo King pour -17 octets
Essayez-le en ligne!
la source
floor
partie vérifie si$_/w
(c'est-à-dire le facteur actuel divisé par un nombre) est un nombre entierPyth ,
5451454236 octetsEssayez-le en ligne!
Accepte les entrées sous la forme
1+2j
- des nombres purement réels ou imaginaires peuvent omettre l'autre composant (par exemple9
,2j
). La sortie est une liste séparée par des sauts de ligne de nombres complexes, sous la forme(1+2j)
, avec des nombres purement imaginaires omettant la partie réelle.Cela utilise une simple division de piste, générant tous les entiers gaussiens de magnitude supérieure à 1 et inférieure à la valeur actuelle, plus la valeur elle-même. Ceux-ci sont filtrés pour conserver ceux qui sont un facteur de la valeur, et le plus petit en magnitude est choisi comme facteur premier suivant. Il s'agit d'une sortie, et la valeur est divisée par celle-ci pour produire la valeur pour la prochaine itération.
Aussi, Pyth bat Jelly 😲 (je ne m'attends pas à ce que ça dure)
la source