Desafio 11
Um número
primo aquele que só pode ser dividido por 1 (um) ou
por ele mesmo. Sendo assim, para saber se um número xé primo, o Logo precisará fazer o teste com cada
número inferior a x. Para
testar com os 30 primeiros números, eu faria assim:
MegaLogo repita :x [se :x / (1+contador) = int (:x / (1+contador)) [es (fr [O número] :x [é múltiplo de:]) es 1+contador]] |
 SuperLogo e xLogo repita :x [ se :x / (1+cv) = inteiro (:x / (1+cv)) [mo (sn [O número] sn (:x [é múltiplo de:])) mo 1+cv]] |
FMSLogo
repita :x [ se :x / (1+contevezes) = inteiro (:x / (1+contevezes)) [mostre (fr [O número] fr (:x [é múltiplo de:])) mostre 1+contevezes]]
|
Micromundos façavezes [i :x] [se :x / (2 + :i) = int (:x / (2 + :i)) [mo (sn [O número] :x [é múltiplo de:]) mo 2 + :i]] |
Imagine repetir 30 [ se :x / (1+cv) = inteiro (:x / (1+cv)) [(digitar [O número] :x [é múltiplo de:]) rotular 1+cv]] |
Os exemplos são uma
parte do procedimento que criaremos mais adiante. Note
também que o Micromundos destoa dos demais (usa façavezesem vez de repita por uma questão
pessoal, para mostrar uma outra forma de resolver um mesmo problema).
Também devemos
considerar que não faz sentido testar se é
possível dividir x por 1. Por isso, usei 1+cv e
não apenas cv.
Para podermos testar
qualquer valor, basicamente, ele deverar repetir x-1 vezes o
processo de divisão:
MegaLogo aprenda vai :x repita :x - 1 [ se :x / (1 + contador) = int (:x / (1 + contador)) [es (fr [O número] :x [é múltiplo de:]) es 1 + contador pare]] fim |
 SuperLogo e xLogo aprenda vai :x repita :x - 1 [ se :x / (1+cv) = inteiro (:x / (1+cv)) [mo (sn [O número] sn (:x [é múltiplo de:])) mo 1+cv pare]] fim |
FMSLogo
aprenda vai :x repita :x - 1 [ se :x / (1+contevezes) = inteiro (:x / (1+contevezes)) [mostre (fr [O número] fr (:x [é múltiplo de:])) mostre 1+contevezes pare]] fim
|
Imagine aprender vai :x repetir :x - 1 [ se :x / (1+contador) = int (:x / (1+contador)) [(digitar [O número] :x [é múltiplo de:] 1+contador) parar]] fim |
Mas por que não
aperfeiçoar? De cara, ele poderia testar se o
número é par:
MegaLogo aprenda vai :x se :x / 2 = int (:x / 2) [es (fr [O número] :x [é par]) pare] repita :x - 1 [~ se :x / (1 + contador) = int (:x / (1 + contador)) [es (fr [O número] :x [é múltiplo de:] 1 + contador) pare]] fim |
 SuperLogo xLogo e Micromundos aprenda vai :x se :x / 2 = inteiro (:x / 2) [mo (sn [O número] sn (:x [é par])) pare] repita :x - 1 [ se :x / (1+cv) = inteiro (:x / (1+cv)) [mo (sn [O número] sn (:x [é múltiplo de:])) mo 1+cv pare]] fim |
FMSLogo
aprenda vai :x se :x / 2 = inteiro (:x / 2) [mostre (fr [O número] fr (:x [ é par])) pare] repita :x - 1 [ se :x / (1+contevezes) = inteiro (:x / (1+contevezes)) [mostre (fr [O número] fr (:x [ é múltiplo de:])) mo 1+contevezes pare]] fim
|
Imagine aprender vai :x se :x / 2 = int (:x / 2) [(digitar [O número] :x [é par]) parar] repetir :x - 1 [ se :x / (1+contador) = int (:x / (1+contador)) [(digitar [O número] :x [ é múltiplo de:] 1+contador) parar]] fim |
Os cálculos são rapidamente feitos, mas para
números maiores levará algum tempo (1234327
é um número primo?). Para tornar mais
rápido, considerei que é
necessário fazer os cálculos até o
meio do caminho, por assim dizer. Se x não é um
número primo, então ele é obtido
no máximo fazendo y*y e não faz sentido testar se
ele é
divisível por y+1, y+2, y+3,... Como y*y =
y² = x, basta testar até a raiz quadrada de y². MegaLogo para vai3 :x verifica :x / 2 = int ( :x / 2 ) sev [es ( fr [O número] :x [é par] ) pare] repita :x - 2 ~ [verifica :x / ( 1 + contador ) = int ( :x / ( 1 + contador ) ) ~ sev [es ( fr [O número] :x [é múltiplo de:] 1 + contador ) pare] ~ verifica contador * contador > :x ~ sev [es ( fr :x [é um número primo!] ) pare]] fim |
xLogo aprenda vai3 :x se :x / 2 = inteiro (:x / 2) [mo (sn [O número] sn (:x [é par])) pare] repita :x - 2 [ se :x / (1 + cv) = inteiro (:x / (1 + cv)) [mo (sn [O número] sn (:x [é múltiplo de:])) mo 1 + cv paretudo] se cv*cv > :x [mo (sn :x [é um número primo!]) paretudo]] fim |
SuperLogo aprenda vai3 :x se :x / 2 = inteiro :x / 2 [esc (sn [O número] :x [é par]) pare] repita :x - 2 [ se :x / (1 + cv) = inteiro (:x / (1 + cv)) [esc (sn [O número] :x [é múltiplo de:]) esc 1 + cv pare] se cv*cv > :x [esc (sn :x [é um número primo!]) pare]] fim |
FMSLogo
aprenda vai3 :x se :x / 2 = inteiro :x / 2 [esc (fr [O número] :x [é par]) pare] repita :x - 2 [ se :x / (1 + contevezes) = inteiro (:x / (1 + contevezes)) [esc (fr [O número] :x [é múltiplo de:]) esc 1 + contevezes pare] se contevezes*contevezes > :x [esc (fr :x [é um número primo!]) pare]] fim
|
Micromundos aprenda vai3 :x se :x / 2 = int (:x / 2) [mo (sn [O número] :x [é par]) pare] façavezes [i :x] [se :x / (2 + :i) = int (:x / (2 + :i)) [mo (sn [O número] :x [é múltiplo de:] 2 + :i) paretudo] se :i * :i > :x [mo (sn :x [é um número primo!]) paretudo]] fim |
Imagine aprender vai3 :x se :x / 2 = int (:x / 2) [(digitar [O número] :x [é par]) parar] repetir :x - 2 [ se :x / (1 + contador) = int (:x / (1 + contador)) [(digitar [O número ] :x [é múltiplo de: ]) (digitar 1 + contador) parar] se contador*contador > :x [(digitar :x [: é um número primo!]) parar]] fim |
Para completar a festa, dei-me conta que minhas tentativas acima
falhariam se quizéssemos testar se o número um
é primo ou não: MegaLogo para vai4 :x se :x = 1 [es [Por definição, o número um ( "1 ") não é um número primo] pare] verifica :x / 2 = int ( :x / 2 ) sev [es ( fr [O número] :x [é par] ) pare]
repita :x - 1 [verifica :x / ( 1 + contador ) = int ( :x / ( 1 + contador ) ) ~ sev [es ( fr [número] :x [é múltiplo de:] ) es 1 + contador pare] ~ verifica contador * contador > :x ~ sev [es ( fr :x [é um número primo!] ) pare]] fim |
xLogo aprenda vai4 :x se :x = 1 [mo [Por definição, o número um ("1") não é um número primo] paretudo] se :x / 2 = inteiro (:x / 2) [mo (sn [O número] sn (:x [é par])) pare] repita :x - 1 [ se :x / (1 + cv) = inteiro (:x / (1 + cv)) [mo (sn [O número] sn (:x [é múltiplo de:])) mo 1 + cv paretudo] se cv * cv > :x [mo (sn :x [é um número primo!]) paretudo]] fim |
SuperLogo aprenda vai4 :x se :x = 1 [esc [Por definição, o número um ("1") não é um número primo] pare] se :x / 2 = inteiro :x / 2 [esc (sn [O número] :x [é par]) pare] repita :x [ se :x / (1 + cv) = inteiro (:x / (1 + cv)) [esc (sn [O número] :x [é múltiplo de:]) esc 1 + cv pare] se cv*cv > :x [esc (sn :x [é um número primo!]) pare]] fim
|
FMSLogo
aprenda vai4 :x se :x = 1 [esc [Por definição, o número um ("1") não é um número primo] pare] se :x / 2 = inteiro :x / 2 [esc (fr [O número] :x [é par]) pare] repita :x [ se :x / (1 + contevezes) = inteiro (:x / (1 + contevezes)) [esc (fr [O número] :x [é múltiplo de:]) esc 1 + contevezes pare] se contevezes*contevezes > :x [esc (fr :x [é um número primo!]) pare]] fim
|
Micromundos aprenda vai4 :x se :x = 1 [mo [Por definição, o número um ("1") não é um número primo] paretudo] se :x / 2 = int (:x / 2) [mo (sn [O número] :x [é par]) pare] façavezes [i :x] [se :x / (2 + :i) = int (:x / (2 + :i)) [mo (sn [O número] :x [é múltiplo de:] 2 + :i) paretudo] se :i * :i > :x [mo (sn :x [é um número primo!]) paretudo]] fim |
Imagine aprender vai4 :x se :x = 1 [(digitar [Por definição, o número um ("1") não é um número primo]) parar] se :x / 2 = int :x / 2 [(digitar [O número] :x [é par]) parar] repetir :x [ se :x / (1 + contador) = int (:x / (1 + contador)) [se contador*contador > :x [(digitar :x [é um número primo!]) parar] (digitar [O número] :x [é múltiplo de:] 1 + contador) parar]] fim |
Para provar que podemos sempre melhorar as coisas (ou apenas propor novas opções), que tal usar nos cálculos o resto da divisão inteira? MegaLogo para vai5 :x se :x = 1 [es [Por definição, o número um ( "1 ") não é um número primo] pare] verifica :x / 2 = int ( :x / 2 ) sev [es ( fr [O número] :x [é par] ) pare]
repita :x - 1 [verifica 0 = resto :x ( 1 + contador ) ~ sev [es ( fr [número] :x [é múltiplo de:] ) es 1 + contador pare] ~ verifica contador * contador > :x ~ sev [es ( fr :x [é um número primo!] ) pare]] fim |
xLogo aprenda vai5 :x se :x = 1 [mo [Por definição, o número um ("1") não é um número primo] paretudo] se :x / 2 = inteiro (:x / 2) [mo (sn [O número] sn (:x [é par])) pare] repita :x - 1 [ se 0 = resto :x (1 + cv) [mo (sn [O número] sn (:x [é múltiplo de:])) mo 1 + cv paretudo] se cv * cv > :x [mo (sn :x [é um número primo!]) paretudo]] fim |
SuperLogo aprenda vai5 :x se :x = 1 [esc [Por definição, o número um ("1") não é um número primo] pare] se :x / 2 = inteiro :x / 2 [esc (sn [O número] :x [é par]) pare] repita :x [ se 0 = resto :x (1 + cv) [esc (sn [O número] :x [é múltiplo de:]) esc 1 + cv pare] se cv*cv > :x [esc (sn :x [é um número primo!]) pare]] fim
|
FMSLogo aprenda vai5 :x se :x = 1 [esc [Por definição, o número um ("1") não é um número primo] pare] se :x / 2 = inteiro :x / 2 [esc (fr [O número] :x [é par]) pare] repita :x [ se 0 = resto :x (1 + contevezes) [esc (fr [O número] :x [é múltiplo de:]) esc 1 + contevezes pare] se contevezes*contevezes > :x [esc (fr :x [é um número primo!]) pare]] fim
|
Micromundos aprenda vai5 :x se :x = 1 [mo [Por definição, o número um ("1") não é um número primo] paretudo] se :x / 2 = int (:x / 2) [mo (sn [O número] :x [é par]) pare] façavezes [i :x] [se 0 = resto :x (2 + :i) [mo (sn [O número] :x [é múltiplo de:] 2 + :i) paretudo] se :i * :i > :x [mo (sn :x [é um número primo!]) paretudo]] fim |
Imagine aprender vai5 :x se :x = 1 [(digitar [Por definição, o número um ("1") não é um número primo]) parar] se :x / 2 = int :x / 2 [(digitar [O número] :x [é par]) parar] repetir :x [ se 0 = resto :x (1 + contador) [se contador*contador > :x [(digitar :x [é um número primo!]) parar] (digitar [O número] :x [é múltiplo de:] 1 + contador) parar]] fim |
Saiba mais em:

Números Primos Projeto
ZK
Número Primo na
Wikipedia
Descubra os NúmerosApenas um jogo em flash
Teoria dos Números