Sans utiliser de fonctions d'affacturage / polynôme intégrées, factorisez complètement un polynôme en irréductibles sur les entiers ou un champ fini.
Contribution
Votre programme / fonction recevra un nombre premier (ou zéro) n
en entrée. Le champ / anneau est le champ fini de cet ordre (c'est-à-dire Z/nZ
), ou juste Z
s'il l' n
est 0
. Votre programme peut échouer s'il n
ne l'est pas 0
ou s'il s'agit d' un programme principal. Le polynôme sera en F[x]
.
Votre programme / fonction recevra également le polynôme en entrée.
Il y a une certaine flexibilité dans l'entrée, assurez-vous de spécifier comment vous avez l'intention de recevoir l'entrée. Par exemple, le polynôme peut être entré sous forme de liste de coefficients, ou sous la forme que la plupart des gens attendent (ex:) 50x^3 + x^2
, ou sous une autre forme raisonnable. Ou le format de saisie du champ / anneau peut également être différent.
Production
Votre programme / fonction affichera le polynôme factorisé complètement. Vous pouvez laisser plusieurs racines étendues (c'est- (x + 1)(x + 1)
à- dire au lieu de (x + 1)^2
). Vous pouvez supprimer les espaces entre les opérateurs binaires. Vous pouvez remplacer la juxtaposition par *
. Vous pouvez insérer des espaces dans des endroits étranges. Vous pouvez réorganiser les facteurs dans l'ordre que vous souhaitez. Le x
terme pourrait bien être (x)
. x
peut être écrit comme x^1
; cependant, le terme constant peut ne pas avoir x^0
. Les +
signes étrangers sont autorisés. Vous ne pouvez pas avoir un terme avec un 0
devant, ils doivent être laissés de côté. Le terme principal de chaque facteur doit être positif, les signes négatifs doivent être extérieurs.
Cas de test, votre programme devrait être en mesure de produire une sortie pour chacun d'eux dans un délai raisonnable (disons <= 2 heures):
Contribution: 2, x^3 + x^2 + x + 1
Production: (x + 1)^3
Contribution: 0, x^3 + x^2 + x + 1
Production: (x + 1)(x^2 + 1)
Contribution: 0, 6x^4 – 11x^3 + 8x^2 – 33x – 30
Production: (3x + 2)(2x - 5)(x^2 + 3)
Contribution: 5, x^4 + 4x^3 + 4x^2 + x
Production: x(x + 4)(x + 4)(x + 1)
Contribution: 0, x^5 + 5x^3 + x^2 + 4x + 1
Production: (x^3 + 4x + 1)(x^2 + 1)
Un merci spécial à Peter Taylor pour avoir critiqué mes cas de test
p
a les éléments{0, 1, ... , p-1}
et il est sous mod d'addition / multiplicationp
. Fondamentalement, réduisez n'importe quel coefficient par modp
et vous êtes bon. Notez également que s'il a une racine, c'est-à-dire un facteur linéaire, l'un des{0, ... , p-1}
produira0
(modp
) lorsqu'il sera branché sur le polynôme.Z
consiste à prendre enZ/pZ
compte unp
ascenseur approprié , puis Hensel. Cependant, l'approche golfable est probablement (et c'est certainement la voie que je regarde) d'utiliser une simple limite sur la hauteur des facteurs et de la forcer brutalement.Réponses:
GolfScript (222 octets)
Démo en ligne
Remarques
n
suivi d'un tableau GolfScript de coefficients du plus important au moins significatif. Par exemple,0, x^5 + 5x^3 + x^2 + 4x + 1
devrait être formaté comme0 [1 0 5 1 4 1]
.Z
. Je gèreZ
en utilisant une forme détendue de la hauteur de Mignotte. Un excellent document sur les limites de hauteur dans l'affacturage est Bounds on Factors in Z [x] , John Abbott, 2009 (le lien est vers la préimpression arxiv; son CV dit qu'il a été accepté par le Journal of Symbolic Computation ). La forme la plus détendue qui y soit donnée est en termes de norme L-2, mais pour économiser des octets, je me détends davantage et utilise la norme L-1 à la place. Ensuite, c'est un cas de forçage brutal par la division de première instance.Z
n'est qu'un anneau et il est donc nécessaire de faire la division d'essai par des facteurs candidats non moniques. Je réussis à ne pas implémenter de nombres rationnels en effectuant un test de division des facteurs de premier plan et en accumulant un indicateur "d'erreur"e
.Z
est généralement plus lent et ne peut pas être testé avec la démo en ligne. Cependant, le plus lent des cas de test officiels prend 10 minutes, ce qui est bien dans le délai "raisonnable".la source