Test de primalidade: Diferenzas entre revisións

Contido eliminado Contido engadido
arranxos varios
retiro ligazóns cara os artigos da wiki.es
Liña 7:
{{sen categoría}}
{{revisión}}
[[Ficheiro:Mersene39.png|miniatura|O 39º [[:es:Número_primo_de_Mersenne|número primo de Mersenne]] era o maior coñecido até a data de creación deste artigo.]]
A cuestió''n'' da determinación de se un [[número]] n dado é [[Número primo|primo]] é coñecida como o problema da primalidade. Un '''test de primalidade''' (ou '''recoñecemento da primalidade''') é un [[algoritmo]] que, dado un número de entrada n, non consegue verificar a [[hipótese]] dun [[teorema]] cuxa conclusión é que n é [[Número composto|composto]].
 
Liña 13:
 
== Introdución ==
Os problemas que implican ás matemáticas discretas están entre os máis difíciles das matemáticas. Concretamente o da factorización é un problema para o que aínda non se atopou unha solución que se poida acoutar en [[:es:Tiempo_polinómico|tempo polinomicopolinómico]]<ref>Papadimitriou, Christos H.: ''Computational Complexity''. </ref>
 
Por outra banda, algunhas aplicacións das matemáticas que utilizan o problema da factorización precisan dunha serie de números primos moi grandes escollidos de forma aleatoria. O algoritmo para obter un número primo aleatorio moi grande sería algo así:
Liña 19:
O tempo de finalización deste algoritmo non é determinado, pero existe unha alta probabilidade de que finalice en tempo polinomico a condición de que haxa suficientes números primos e estes estean distribuídos de forma máis ou menos uniforme. Afortunadamente para as aplicacións que precisan números primos aleatorios, isto é así. Vexamos por qué.
 
O primeiro que podemos establecer é que o cardinal do conxunto de primos no conxunto dos [[Número natural|números naturais]] é [[:es:Infinitud_de_los_números_primosInfinitude dos números primos|infinito]] (isto é, que hai infinitos números primos).<math>\mathbb{N}</math> O [[:es:Teorema_de_Dirichlet|teorema de Dirichlet]] ([[1837]]) di que si mcd(a, ''n'') = 1 entón hai infinitos curmáns [[Congruencia (álxebra)|congruentes]] coa módulo n. ''N''outras palabras (e utilizando un corolario de Dirichlet), os números primos están uniformemente distribuídos nas clases congruentes coa [[:es:Función_φ_de_Euler|función φ de Euler]] en para calquera valor de n.<math>\mathbb{N}_n^*</math>
 
Claro que, si os números primos están uniformemente distribuídos, pero hai un número pequeno deles, a procura podería ser imposible na práctica. Para resolver este segundo problema podemos acudir ao [[:es:Teorema_de_los_números_primosTeorema dos números primos|teorema de Hadamard]] ([[1896]]) que establece que a cardinalidad do conxunto de números primos no intervalo [2..n] é asintótico a .<math> n /{\log \, n}</math> Este número tende a infinito moi suavemente, o que implica que aínda para valores grandes de n existe unha probabilidade suficientemente alta de dar cun número primo de forma aleatoria.
 
Do visto até aquí podemos co''n''cluír que o algoritmo anterior pode obter unha resposta en tempo polinomico se existe un algoritmo polinomial para comprobar que un número n arbitrariamente grande é primo. O que nos devolve ao problema da primalidade.
Liña 32:
Os problemas da factorización dun número dado e a determinación de números primos son moi antigos. Os rexistros históricos sobre o estudo de números primos remónt[[Século -III|a]]<nowiki/>nse a [[Euclides]] ([[Século -III|século III]] a. C.) [[Século -VI|a]]<nowiki/>índa que hai evidencias de que o coñecemento da existencia destes números tan particulares poderíase remontar a [[Pitágoras]] ([[Século -VI|século VIN]] a. [[Século -VI|C.]]).
 
Con todo, o primeiro procedemento matemático coñecido concernente estes números remóntase a [[Eratóstenes]] ([[Século -II|século II]] a. C.) e é a coñecida [[:es:Criba_de_Eratóstenes|criba de Eratóstenes]], que aínda se estuda nos centros de educación primaria. O método é sinxelo: para obter os números primos menores que un dado, primeiro colocamos os números de 1 a n nunha lista e empezamos tachando todas as posicións pares. Logo, sobre a lista que queda tachamos todos os que son múltiplo de tres (o seguinte número da lista despois do 2). Logo sobre os que quedan todos os que son múltiplos de cinco (o seguinte número da lista despois do 3).
 
Hoxe en día, este algoritmo ten un valor máis histórico que práctico. Funciona ben, pero é moi ineficiente.
 
A mellora máis obvia atén á forma na que o algoritmo termina (curiosamente Eratóstenes non tivo en conta este feito e foi o matemático árabe [[:es:Al-Marrakushi_ibn_AlMarrakushi ibn Al-Banna|ibn ao-Banna]] quen a propuxo séculos despois): é suficiente con iterar até os divisores primos de n menores que <math>\sqrt{n}</math>.
 
Outro problema da criba é que non responde o problema da simple determinación de primalidade dun número dado, senón que ofrece unha lista (potencialmente [[:es:Infinitud_de_los_números_primos|infinita]]) de números primos.
 
O problema, máis concreto, de determinar si un número n dado é primo pode derivarse do anterior, simplemente simúlase a criba para n-1 e compróbase si permanece nela. A cuestión é que o custo de seguir este procedemento é moi grande.
 
Como moitas outras achegas matemáticas, o problema da primalidade chegou á Europa moderna a través dos árabes, pero non foi até moitos séculos despois que apareceron os primeiros rexistros escritos sobre a primalidade e a súa solución. Estes corresponden ao matemático italiano [[Leonardo Fibonacci|Leonardo de Pisa]] (Fibonacci) quen presentou un algoritmo moi simple para determinar si un número n dado é primo consistente en comprobar que ningún outro número primo inferior á raíz cadrada de n divíde a <math>n</math>. Este algoritmo ten a característica de ser determinista (sempre obtén unha solución) aínda que tremendamente ineficiente. En realidade, Fibonacci é máis coñecido pola sucesión que leva o seu nome e que tamén ten o seu papel no problema que nos ocupa. Logo veremos algo máis sobre a famosa [[:es:Sucesión_de_Fibonacci|sucesión de Fibonacci]].
 
O primeiro en utilizar relacións observadas entre os números para determinar a primalidade foi o boloñés [[:es:Pietro_Antonio_Cataldi|Pietro Antonio Cataldi]] co seu traballo sobre os números perfectos.
 
Un [[número perfecto]] é aquel que é igual á suma das súas divisores propios. Por exemplo 6 é perfecto, xa que a suma das súas divisores (1+2+3) é igual ao mesmo. O sete primeiros números perfectos son 6, 28, 496, 8128, 33550336, 8589869056 e 137438691328.
Liña 54:
Contemporáneo de Mersenne e moito máis importante para a historia e a estado da arte actual do problema que estamos a tratar foi o importante matemático [[Pierre de Fermat]] (1607-1665). Fermat é posiblemente o teórico numérico máis renombrado da historia e é moi coñecido por un teorema que esencialmente estivo sen demostración durante máis de trescentos anos. Con referencia á primalidade, Fermat tivo correspondencia con Mersenne e, de feito, estableceu un resultado sobre os números primos que é esencial para as técnicas modernas de determinación da primalidade.
 
Fermat buscaba números n>1 que lle axudasen a comprobar a primalidade dos [[:es:Número_de_MersenneNúmero de Mersenne|números de Mersenne.]]Na súa procura viu que o teorema antes exposto era útil para detectar posibles primos q tales que <math>q | 2^{37}-1</math> .Fermat tamé''n'' suxeriu que os números denominados números de Fermat debían ser primos e comprobouno para todos os n menores que 4. Non puido demostralo para 5 e hoxe sábese que iso é composto, como o son todos os restantes até n=24 (e posiblemente todos os demais, aínda que este último extremo é aínda unha conxectura).
 
Outro eminente matemático que estivo interesado no problema da primalidade foi o suízo [[Leonhard Euler|Leonhard Euler.]] Euler sentiu atraído polos resultados de Fermat.
 
Houbo outros matemáticos tamén moi eminentes que traballaron no campo da factorización de números, por exemplo [[:es:Adrien-Marie_LegendreMarie Legendre|Legendre]] e [[Carl Friedrich Gauss|Gauss]], e que tamén fixeron algunhas contribucións ao problema da primalidade; pero o último dos matemáticos clásicos do que falaremos que obtivo notables resultados sobre a cuestión foi o francés [[:es:François_Éduard_Anatole_Lucas|François Éduard Anatole Lucas.]]. Lucas traballou sobre os [[:es:Número_de_Fibonacci|números de Fibonacci]] e de Mersenne, obtivo resultados sobre a divisibilidad dos primeiros e determinou unha proba de primalidade para os números de Mersenne (que aplicou á comprobación de primalidade de M127) que veremos a continuación.
 
== Tests verdadeiros de primalidade ==
Nos apartados anteriores falouse de dous problemas relacionados (factorización e primalidade) que dalgunha maneira son complementarios. Con todo, as dúas cuestións son de natureza moi distinta. Para convencer a alguén de que un número foi factorizado é suficiente con mostrar os factores e o resultado queda claro. Con todo convencer a esa mesma persoa de que un número dado é primo pode ser moito máis difícil. Como o matemático parisiense do [[século XIX]] [[:es:Fortuné_Landry|Fortuné Landry]] sinalou, a menos que a outra parte coñeza os métodos de comprobación da primalidade e realice por si mesma os cálculos, a sinxela resposta “é primo” é só cuestión de fe. Un test (ou recoñeceme''n''to) de primalidade é un algoritmo que, dado un número de entrada n, non consegue verificar a hipótese dun teorema cuxa conclusión é que n é composto.
 
Esta é a visión do matemático; desde o punto de vista do enxeñeiro as cousas non son brancas ou negras. Por iso, convimos en diferenciar os tests (ou recoñecementos) das probas. Antes de proseguir, chegou o momento de definir formalmente ambos os conceptos.<blockquote style=" width:90%; padding: 0.8em; border: 1px solid #880000; background-color: #FFFFFF;">
Liña 75:
O interese, fundamentalmente, é a aplicación práctica das técnicas. Con todo, é interesante ver algo sobre as probas. Nesta primeira sección ocúpase destas e dalgúns do test clásicos de primalidade, deixando para un apartado posterior unha discusión sobre o grupo de algoritmos complementario que, aínda que non proban a primalidade con certidumbre matemática resultan moito máis interesantes ao ser computablemente máis estables e predicibles.
 
Para empezar, o exemplo clásico de test verdadeiro de primalidade: o [[:es:Test_de_Lucas-Lehmer|Test de Lucas-Lehmer.]] A proba LL aplícase aos números de Mersenne (a entrada é o índice p do número de Mersenne do que se quere comprobar a primalidade). A definición do algoritmo é a seguinte:
 
Este resultado é importa''n''te, xa que presenta a proba como unha secuencia sinxela de pasos lineal en n onde todas as operacións básicas (produtos, restas, módulos, comparacións) son computables en tempo polinómico.
Liña 87:
Existe un resultado menos xeral que o de Pocklington que é debido a outro matemático do século XIX (o teorema de Proth). Pero como se dixo é menos xeral e ten a mesma aplicación, polo que non entraremos en detalles.
 
A última proba neste apartado débese a Pepin (1877). O [[:es:Test_de_Pépin|teorema de PepinPépin]] enúnciase como segue:
 
''A'' constante 3 en realidade pódese substituír por calquera enteiro positivo para o que un operador chamado [[:es:Símbolo_de_Jacobi|símbolo de Jacobi]] sexa igual a–1. Isto inclúe aos valores 3, 5 e 10.
 
Así como a proba LKL só se pode aplicar aos números de Mersenne, a proba de Pepin só se pode aplicar aos números de Fermat, polo que o seu uso (como no caso de LKL) queda bastante restrinxido.
 
== Tests probabilísticos ==
Os tests probabilísticos están baseados na idea de relaxar a corrección da proba para conseguir un comportamento de resposta [[:es:Tiempo_polinómicoTempo polinómico|polinomial ou subpolinomial.]] Baséanse ben no uso PTF (que acabamos de comentar), ben no uso do que se coñecen como verificadores e falsadores de Euler.
 
O primeiro exemplo de test probabilístico que veremos é o [[Test de primalidade de Fermat|test de Fermat.]] Devandito test está baseado no PTF. O algoritmo baseado neste test aplícase elixindo varios enteiros aleatorios entre 2 e n-2 e calculando .<math>a</math><math>r \equiv a^{n-1} \pmod n</math> Si algún valor de é distinto de 1 o algoritmo devolve composto, noutro caso devolve primo.<math>r</math> A fortaleza deste test radica en que tras un número normalmente pequeno de repeticións a probabilidade de que un número composto pase como primo é moi pequena.
 
Como vimos na sección anterior, o test de Fermat adoece dun coñecido problema: os [[:es:Números_de_Carmichael|números de Carmichael.]]. Os números de Carmichael pasan a condición de Fermat para todos os posibles valores de ; isto implica que si o noso candidato a número primo fose un número de Carmichael, non importa cantas veces pasemos o test de Fermat, o resultado sempre sería negativo e en consecuencia o resultado do test sería un falso primo positivo.<math>a</math> Con todo, os números de Carmichael son relativamente escasos (hai 105.212 deles menores de ) polo que a probabilidade de elixir algún deles é realmente baixa.<math>10^{15}</math> O test de Fermat é de amplo uso no campo da criptografía.
 
Outro test moi coñecido e utilizado en criptografía é o [[:es:Test_de_Solovay-Strassen|test de Solovay-Strassen]] (SS). Este test está baseado ''n''o [[:es:Criterio_de_Euler|criterio de Euler]].
 
== Avances recentes ==
Liña 119:
O recente descubrimento dun algoritmo determinista de tempo polinomial que non se basea en ningunha conxectura non probada debe ser considerado un fito importante. Concretamente en agosto do ano [[2002]] tres académicos da Universidade de Kanpur (Agrawal, Kayal e Saxena) presentaron un algoritmo determinista de clase P para a determinación da primalidade dun número.<ref>Agrawal, Manindra; Kayal, Neeraj; Saxena, Nitin: "<small>PRIMES</small> is in <small>P</small>". </ref> A clave do algoritmo é unha versión simplificada do PTF, isto é a condición:<center><math>(x-a)^p \equiv (x^p-a) \pmod{x^r-1,\;p}</math></center>Os autores arranxáronllas para formular o seguinte algoritmo, que se probou pode executarse nun tempo de complexidade máxima de .<math>\mathcal{O}((\log \, n)^{\frac{21}{2}} f(\log \; \log \, n))</math>
 
Os autores demostraron ademais que, si determinados números primos (chamados [[Número primo de Sophie Germain|números primos de Sophie Germain]]) teñen a distribución conxeturada polo matemático austriaco [[:es:Emil_Artin|Emil Artin]], o expoñente 21/2 que aparece na expresión de complexidade pode reducirse a 15/2. O que implica que o tempo estimado de execución sería equivalente ao dalgunha proba de primalidade das vistas anteriormente (concretamente a proba ECPP). E no artigo publicado polos mesmos, tamén mencionaban unha versión do algoritmo AKS presentada por H.W. Lenstra e C. Pomerance que se executa en tempo de forma incondicional.<ref>H. W. Lenstra jr. and Carl Pomerance: "Primality testing with Gaussian periods".<br>
</ref><math>\mathcal{O}((\log \, n)^{6+\epsilon})</math>
 
Liña 125:
 
== Referencias ==
* Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford: ''Introduction to Algorithms.'' Sección 31.8: "Primality testing", pp.887–896. MIT Press & McGraw-Hill, 2a edición, [[2001|2001.]] ([[:es:Special:BookSources/0262032937|ISBN 0-262-03293-7]].)
* Crandall, Richard & Pomerance, Carl: Prime Numbers: A Computational Perspective Capítulo 3: "Recognizing Primes and Composites", pp.109–158. Capítulo 4: "Primality Proving", pp.159–190. Sección 7.6: "Elliptic curve primality proving (ECPP)", pp.334–340. Springer, 1a edición, 2001. ([[:es:Special:BookSources/0387947779|ISBN 0-387-94777-9]].)
* Knuth, Donald. ''The Art of Computer Programming'', Volume 2: ''Seminumerical Algorithms.'' Páxinas 391–396 de sección 4.5.4. Addison-Wesley, 3a edición, 1997. ([[:es:Special:BookSources/0201896842|ISBN 0-201-89684-2]].)
* Williams, H.C.: ''Édouard Lucas and Primality Testing.'' John Wiley & Sons, 1998. ([[:es:Special:BookSources/0471148520|ISBN 0-471-14852-0]].)
 
=== Notas ===