2017-10-19 3 views
2

Est-ce que PARI/GP a une fonction pour trouver le plus petit facteur premier d'un t_INT ou sinon effectuer une factorisation partielle d'un nombre entier?Fonction pour trouver le facteur premier le moins

Par exemple, si je le numéro:

a=261432792226751124747858820445742044652814631500046047326053169701039080900441047539208779404889565067 

il faut beaucoup de temps pour le faire parce que factor(a)a contient deux énormes facteurs premiers. Cependant, il est assez facile de trouver que 17 est un diviseur de a.

Bien sûr, dans ce cas, j'aurais pu utiliser seulement forprime(p=2,,a % p == 0 && return(p)) ou une division d'essai similaire pour trouver le facteur. Mais si le moindre facteur avait eu 20 chiffres décimaux, disons, ce serait impraticable, et j'aurais pu vouloir utiliser les méthodes sophistiquées de factor dans ce cas.

Il serait donc idéal si je pouvais appeler factor avec une sorte de drapeau disant que je serai heureux avec une factorisation partielle, ou de dire que tout ce que je me soucie de est le plus petit diviseur non trivial, etc.

+0

Avez-vous pensé à une variante de la [factorisation de la courbe elliptique de Lenstra] (https://en.wikipedia.org/wiki/Lenstra_elliptic-curve_factorization) (qui se spécialise dans l'obtention de petits facteurs)? Vous pouvez le modifier pour casser une fois qu'il a trouvé un facteur. –

+0

@JosephWood La fonction 'factor' ou' factorint' de PARI utilise déjà des méthodes elliptiques comme l'une de ses approches. Je sais que je pourrais coder ma propre implémentation de courbe elliptique, mais je demandais s'il y avait quelque chose de intégré dans PARI/GP. –

+1

La bibliothèque PARI a la fonction 'Z_factor_until' qui pourrait être utile. Mais prouver que vous avez trouvé le plus petit facteur premier n'est généralement pas facile, choisissez une option: ne fonctionne qu'avec des nombres spéciaux, certains avec une probabilité élevée plutôt qu'avec certitude; longue durée de fonctionnement; ne fonctionne que sur de petits nombres. – Charles

Répondre

1

une réponse partielle très simple à ma question est que factor a un argument optionnel lim, donc vous pouvez simplement dire:

factor(a, 10^5) 

par exemple, et que des facteurs ci-dessous 10^5 apparaîtront dans le résultat (cofacteur supérieur à 10^5 peut être composite!).

L'argument facultatif à factorint est entièrement différent, un "drapeau" bit-sage, et il ne permet pas de spécifier une limite. C'était probablement ce qui me déroutait. A titre d'exemple:

factorint(a, 1+8) 

sélectionne drapeaux 1 ("éviter mpqs") et 8 ("ne pas exécuter ECM final").