Écrivez un programme d'assemblage GOLF qui lit un entier à partir de stdin (suivi d'un retour à la ligne de fin) et génère ses facteurs premiers séparés par des retours à la ligne, suivis d'un retour à la ligne de fin sur stdout.
Les facteurs premiers n'ont pas besoin d'être dans un ordre particulier. 1
n'est pas un facteur primordial.
Votre binaire GOLF (après assemblage) doit tenir dans 8192 octets.
Votre programme sera noté en l'exécutant 10 fois, chacun avec l'une des entrées suivantes:
8831269065180497
2843901546547359024
6111061272747645669
11554045868611683619
6764921230558061729
16870180535862877896
3778974635503891117
204667546124958269
16927447722109721827
9929766466606501253
Ces chiffres sont grossièrement classés en fonction de la difficulté. Le premier devrait facilement être résolu par la division de première instance.
L'optimisation vers cet ensemble de nombres est contraire à l'esprit de la question, je peux changer l'ensemble de nombres à tout moment. Votre programme doit fonctionner pour tout nombre d'entrée 64 bits positif, pas seulement pour ceux-ci.
Votre score est la somme des cycles CPU utilisés pour factoriser les nombres ci-dessus.
Parce que GOLF est très nouveau, je vais inclure quelques pointeurs ici. Vous devriez lire la spécification GOLF avec toutes les instructions et les coûts de cycle . Dans le référentiel Github, des exemples de programmes peuvent être trouvés. En particulier, regardez l' exemple de programme factoriel , qui montre les entrées / sorties.
Compilez votre programme en binaire en exécutant python3 assemble.py your_source.golf
. Ensuite, exécutez votre programme en utilisant python3 golf.py your_source.bin
, cela devrait également imprimer le nombre de cycles. Voir les valeurs du contenu du registre à la sortie du programme avec le -d
drapeau - utilisez --help
pour voir tous les drapeaux.
1
n'est pas un facteur premier, devrait-il seulement imprimer l'entier d'entrée?Réponses:
2 279 635 cycles - 7373 octets (déterministes)
Un par un:
Sommaire:
J'utilise une combinaison de la division d'essai et de l'algorithme rho de Brent-Pollard pour la factorisation, et la recherche de table plus Miller-Rabin pour les tests de primalité. J'ajouterai plus d'explications demain.
Notez qu'en raison de la limite de caractères sur la longueur du message, le deuxième tableau de données est tronqué. Cet essentiel comprend la table complète.
la source
mov o, 42
un cadeau mort.Total 36 757 269 913 cycles
830B assemblé
Factorisation par division d'essai, avec quelques optimisations. Probablement pas le plus rapide, mais comme personne d'autre n'a encore posté, je vais le lancer.
Sortie complète de ma boucle de synchronisation, au cas où quelqu'un voudrait vérifier les résultats et / ou mon copier-coller et mes calculs.
la source
divu
: stackoverflow.com/questions/5558492/… . Quant à votre réponse - cette question n'était pas destinée à être résolue en utilisant la division d'essai: Pfactor * factor < number
- aucun nombre ne peut avoir des facteurs supérieurs à la racine carrée.score = 378 867 816 cycles
[randomisé - vos résultats peuvent varier]
Utilise le test de primalité de Miller-Rabin (une version déterministe qui peut gérer jusqu'à 2 ^ 64), un peu d'affacturage d'essai et d' affacturage ECM . Toutes les opérations algébriques sont là, y compris l'addition modulaire, la soustraction, la multiplication, l'exponentiation et l'inversion (mod n <2 ^ 64).
La multiplication modulaire est sous-optimale - elle fait une recherche binaire pour le quotient. Le calcul du reste d'une division de 128 par 64 est difficile sans instruction intégrée correspondante. Accélérez cela et le tout ira plus vite.
2290 octets compilés
Sortie:
la source