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
Números Primos Projeto ZK
Número Primo na Wikipedia
Descubra os NúmerosApenas um jogo em flash
Teoria dos Números