Para testar se um número é primo ou não, por que precisamos testar se é divisível apenas até a raiz quadrada desse número?
floor(sqrt(n))
.
Para testar se um número é primo ou não, por que precisamos testar se é divisível apenas até a raiz quadrada desse número?
floor(sqrt(n))
.
Respostas:
Se um número n
não é primo, ele pode ser fatorado em dois fatores a
e b
:
n = a * b
Agora a
e b
não pode ser maior que a raiz quadrada de n
, desde então o produto a * b
seria maior que sqrt(n) * sqrt(n) = n
. Portanto, em qualquer fatoração de n
, pelo menos um dos fatores deve ser menor que a raiz quadrada de n
e, se não conseguirmos encontrar fatores menores ou iguais à raiz quadrada, n
deve ser primo.
sqrt(n)
precisa ser preciso o suficiente para que essa propriedade seja mantida, pois estamos usando pontos flutuantes.
i * i <= n
vez de i <= sqrt(n)
evitar a complexidade dos números de ponto flutuante.
Digamos m = sqrt(n)
então m × m = n
. Agora, se n
não é primo, n
pode ser escrito como n = a × b
, então m × m = a × b
. Tenha em conta que m
é um número real enquanto n
, a
e b
são números naturais.
Agora pode haver três casos:
Nos 3 casos min(a, b) ≤ m
,. Portanto, se procurarmos atém
, encontraremos pelo menos um fator de n
, o suficiente para mostrar que n
não é primo.
n is not a prime
, e prove, caso contrário, é primo.
Uma explicação mais intuitiva seria:
A raiz quadrada de 100 é 10. Digamos axb = 100, para vários pares de a e b.
Se a == b, então eles são iguais e são a raiz quadrada de 100, exatamente. Qual é 10.
Se um deles for menor que 10, o outro deverá ser maior. Por exemplo, 5 x 20 == 100. Um é maior que 10, o outro é menor que 10.
Pensando em axb, se um deles cair, o outro deve aumentar para compensar, para que o produto fique em 100. Eles giram em torno da raiz quadrada.
A raiz quadrada de 101 é de cerca de 10.049875621. Portanto, se você estiver testando o número 101 quanto à primalidade, precisará experimentar os números inteiros até 10, incluindo 10. Mas 8, 9 e 10 não são eles mesmos primos, então você só precisa testar até 7, o que é prime.
Porque se houver um par de fatores com um dos números maior que 10, o outro deve ser menor que 10. Se o menor não existir, não haverá um fator maior correspondente a 101.
Se você estiver testando 121, a raiz quadrada é 11. Você precisa testar os números inteiros primos 1 a 11 (inclusive) para ver se eles são iguais. 11 passa 11 vezes, portanto 121 não é primo. Se você tivesse parado aos 10 e não testado 11, teria perdido 11.
Você deve testar todos os números inteiros primos maiores que 2, mas menores ou iguais à raiz quadrada, assumindo que você esteja testando apenas números ímpares.
`
Suponha que n
não seja um número primo (maior que 1). Portanto, existem números a
e b
tais que
n = ab (1 < a <= b < n)
Ao multiplicar a relação a<=b
por a
e b
obtemos:
a^2 <= ab
ab <= b^2
Portanto: (observe que n=ab
)
a^2 <= n <= b^2
Portanto: (Observe que a
e b
são positivos)
a <= sqrt(n) <= b
Portanto, se um número (maior que 1) não for primo e testamos a divisibilidade até a raiz quadrada do número, encontraremos um dos fatores.
Vamos supor que o número inteiro fornecido N
não seja primo,
Então N pode ser fatorado em dois fatores a
e b
, 2 <= a, b < N
tal que N = a*b
. Claramente, os dois não podem ser maiores quesqrt(N)
simultaneamente.
Vamos assumir, sem perda de generalidade, que a
é menor.
Agora, se você não encontrar nenhum divisor de N
pertença no intervalo[2, sqrt(N)]
, o que isso significa?
Isto significa que N
não têm qualquer divisor em [2, a]
comoa <= sqrt(N)
.
Portanto, a = 1
e , b = n
portanto, por definição, N
é primo .
...
Leitura adicional se você não estiver satisfeito:
Muitas combinações diferentes de (a, b)
podem ser possíveis. Digamos que eles são:
(a 1 , b 1 ), (a 2 , b 2 ), (a 3 , b 3 ), ....., (a k , b k ). Sem perda de generalidade, assuma a i <b i ,1<= i <=k
.
Agora, para poder mostrar que N
não é primo, basta mostrar que nenhum de um i pode ser fatorado ainda mais. E também sabemos que a i <= sqrt(N)
e, portanto, você precisa verificar até o sqrt(N)
que cobrirá todos os i . E, portanto, você poderá concluir se deve ou nãoN
primo.
...
É tudo realmente apenas usos básicos de fatoração e raízes quadradas.
Pode parecer abstrato, mas, na realidade, simplesmente reside no fato de que o fatorial máximo possível de um número não primo teria que ser sua raiz quadrada porque:
sqrroot(n) * sqrroot(n) = n
.
Dado que, se qualquer número inteiro acima 1
e abaixo ou até for sqrroot(n)
dividido uniformemente em n
,n
não pode ser um número primo.
Exemplo de pseudo-código:
i = 2;
is_prime = true;
while loop (i <= sqrroot(n))
{
if (n % i == 0)
{
is_prime = false;
exit while;
}
++i;
}
guard
declaração no Swift em conjunto com este prático stackoverflow.com/a/25555762/4475605 para fazer uma saída antecipada de um cálculo, em vez de desperdiçar energia computacional. Obrigado por postar.
++i
se tornar o número 1, que sempre retornaria falso (porque 1 se divide em tudo). Corrigi a resposta acima.
Portanto, para verificar se um número N é Prime ou não. Precisamos apenas verificar se N é divisível por números <= SQROOT (N). Isso ocorre porque, se fatorarmos N em quaisquer 2 fatores, diga X e Y, ou seja. N = X Y. Cada um de X e Y não pode ser menor que SQROOT (N) porque, então, X Y <N Cada um de X e Y não pode ser maior que SQROOT (N) porque, então, X * Y> N
Portanto, um fator deve ser menor ou igual a SQROOT (N) (enquanto o outro fator é maior que ou igual a SQROOT (N)). Portanto, para verificar se N é Prime, precisamos apenas verificar esses números <= SQROOT (N).
Digamos que tenhamos um número "a", que não é primo [não significa número primo / composto - um número que pode ser dividido igualmente por números diferentes de 1 ou ele próprio. Por exemplo, 6 podem ser divididos igualmente por 2 ou 3, bem como por 1 ou 6].
6 = 1 × 6 ou 6 = 2 × 3
Então agora se "a" não é primo, ele pode ser dividido por outros dois números e digamos que esses números sejam "b" e "c". Que significa
a = b * c.
Agora, se "b" ou "c", qualquer um deles for maior que a raiz quadrada de "a" que a multiplicação de "b" e "c" será maior que "a".
Portanto, "b" ou "c" é sempre <= raiz quadrada de "a" para provar a equação "a = b * c".
Por causa do motivo acima, quando testamos se um número é primo ou não, verificamos apenas a raiz quadrada desse número.
Dado qualquer número n
, uma maneira de encontrar seus fatores é obter a raiz quadrada p
:
sqrt(n) = p
Obviamente, se multiplicarmos p
por si só, voltaremos n
:
p*p = n
Pode ser reescrito como:
a*b = n
Onde p = a = b
. Se a
aumenta, b
diminui para manter a*b = n
. Portanto, p
é o limite superior.
Atualização: Estou relendo esta resposta novamente hoje e ficou mais clara para mim. O valor p
não significa necessariamente um número inteiro porque, se for, n
não seria um primo. Portanto, p
poderia ser um número real (ou seja, com frações). E, em vez de passar por toda a gama de n
, agora só precisamos passar por toda a gama de p
. O outro p
é uma cópia espelhada, de modo que reduzimos o intervalo pela metade. E então, agora estou vendo que podemos realmente continuar refazendo square root
e fazendo isso p
para mais da metade do intervalo.
Seja n não primo. Portanto, ele possui pelo menos dois fatores inteiros maiores que 1. Seja f o menor dos fatores de n. Suponha f> sqrt n. Então n / f é um inteiro LTE sqrt n, portanto menor que f. Portanto, f não pode ser o menor fator de n. Reductio ad absurdum; O menor fator de n deve ser LTE sqrt n.
Qualquer número composto é um produto de números primos.
Digamos n = p1 * p2
, onde p2 > p1
e eles são primos.
Se n % p1 === 0
então n é um número composto.
Se n % p2 === 0
então adivinhe n % p1 === 0
também!
Portanto, não há como se, n % p2 === 0
mas n % p1 !== 0
ao mesmo tempo. Em outras palavras, se um número composto n pode ser dividido igualmente por
p2, p3 ... pi (seu fator maior), ele também deve ser dividido pelo fator mais baixo p1 . Acontece que o fator mais baixo p1 <= Math.square(n)
é sempre verdadeiro.
Para testar a primalidade de um número, n , seria de esperar um loop como o seguinte em primeiro lugar:
bool isPrime = true;
for(int i = 2; i < n; i++){
if(n%i == 0){
isPrime = false;
break;
}
}
O que o loop acima faz é o seguinte: para um dado 1 <i <n , ele verifica se n / i é um número inteiro (deixa o restante 0). Se existe um i para o qual n / i é um número inteiro, podemos ter certeza de que n não é um número primo, momento em que o loop termina. Se para no i, n / i é um número inteiro, então n é primo.
Como em todo algoritmo, perguntamos: podemos fazer melhor?
Vamos ver o que está acontecendo no loop acima.
A sequência de i é: i = 2, 3, 4, ..., n-1
E a sequência de verificações inteiras é: j = n / i, que é n / 2, n / 3, n / 4, ..., n / (n-1)
Se para alguns i = a, n / a é um número inteiro, então n / a = k (número inteiro)
ou n = ak, claramente n> k> 1 (se k = 1, então a = n, mas eu nunca alcança n; e se k = n, então a = 1, mas inicia o formulário 2)
Além disso, n / k = a e, como mencionado acima, a é um valor de i, então n> a> 1.
Portanto, a e k são números inteiros entre 1 e n (exclusivo). Como i alcança todos os números inteiros desse intervalo, em alguma iteração i = a e em outra iteração i = k. Se o teste de primalidade de n falhar por min (a, k), também falhará por max (a, k). Portanto, precisamos verificar apenas um desses dois casos, a menos que min (a, k) = max (a, k) (onde duas verificações se reduzam a um), ou seja, a = k, no qual a * a = n, que implica a = sqrt (n).
Em outras palavras, se o teste de primalidade de n falhar em alguns i> = sqrt (n) (ou seja, max (a, k)), também falhará em alguns i <= n (ou seja, min (a , k)). Portanto, seria suficiente se executarmos o teste de i = 2 para sqrt (n).
n = a*b
ea <= b
entãoa*a <= a*b = n
.