J, 50 40 38 37 caracteres
f=:3 :'+/y<:}.~.,(~:/**/)~p:i._1&p:y'
Uso:
f 1
0
f 62
18
f 420
124
f 10000
2600
Com agradecimentos a FUZxxl .
Teste de performance
showtotal_jpm_ ''[f 1[start_jpm_ ''
Time (seconds)
┌───────┬──────┬────────┬────────┬─────┬────┬───┐
│name │locale│all │here │here%│cum%│rep│
├───────┼──────┼────────┼────────┼─────┼────┼───┤
│f │base │0.000046│0.000046│100.0│100 │1 │
│[total]│ │ │0.000046│100.0│100 │ │
└───────┴──────┴────────┴────────┴─────┴────┴───┘
showtotal_jpm_ ''[f 1[f 62[start_jpm_ ''
Time (seconds)
┌───────┬──────┬────────┬────────┬─────┬────┬───┐
│name │locale│all │here │here%│cum%│rep│
├───────┼──────┼────────┼────────┼─────┼────┼───┤
│f │base │0.000095│0.000095│100.0│100 │2 │
│[total]│ │ │0.000095│100.0│100 │ │
└───────┴──────┴────────┴────────┴─────┴────┴───┘
showtotal_jpm_ ''[f 1[f 62[f 420[start_jpm_ ''
Time (seconds)
┌───────┬──────┬────────┬────────┬─────┬────┬───┐
│name │locale│all │here │here%│cum%│rep│
├───────┼──────┼────────┼────────┼─────┼────┼───┤
│f │base │0.000383│0.000383│100.0│100 │3 │
│[total]│ │ │0.000383│100.0│100 │ │
└───────┴──────┴────────┴────────┴─────┴────┴───┘
showtotal_jpm_ ''[f 1[f 62[f 420[f 10000[start_jpm_ ''
Time (seconds)
┌───────┬──────┬────────┬────────┬─────┬────┬───┐
│name │locale│all │here │here%│cum%│rep│
├───────┼──────┼────────┼────────┼─────┼────┼───┤
│f │base │0.084847│0.084847│100.0│100 │4 │
│[total]│ │ │0.084847│100.0│100 │ │
└───────┴──────┴────────┴────────┴─────┴────┴───┘
showtotal_jpm_ ''[f 1[f 62[f 420[f 10000[f 50000[start_jpm_ ''
Time (seconds)
┌───────┬──────┬────────┬────────┬─────┬────┬───┐
│name │locale│all │here │here%│cum%│rep│
├───────┼──────┼────────┼────────┼─────┼────┼───┤
│f │base │5.014691│5.014691│100.0│100 │5 │
│[total]│ │ │5.014691│100.0│100 │ │
└───────┴──────┴────────┴────────┴─────┴────┴───┘
Não sou um teórico, como já vimos aqui no passado, mas acho que a complexidade do tempo é algo como O (n p 2 ), em que n p é o número de primos até e incluindo o número de entrada n. Isso se baseia na suposição de que a complexidade do meu método (gerando uma tabela de multiplicação muito grande) supera em muito a complexidade da função de geração principal incorporada a J.
Explicação
f=:3 :'...'
declara um verbo (monádico) (função). A entrada para o verbo é representada por y
dentro da definição de verbo.
p:i._1&p:y
O p:
verbo é o verbo primos multiuso, e é usado de duas maneiras diferentes aqui: _1&p:y
retorna o número de primos menor do que y
então p:i.
gera cada um deles. Usando 10 como entrada:
p:i._1&p:10
2 3 5 7
(~:/**/)~
gera a tabela da qual falei anteriormente. */
gera uma tabela de multiplicação, ~:/
gera uma tabela não-igual (para eliminar os quadrados) e ambos são multiplicados juntos. Usando nossa saída anterior como entrada:
*/~2 3 5 7
4 6 10 14
6 9 15 21
10 15 25 35
14 21 35 49
~:/~2 3 5 7
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0
(~:/**/)~2 3 5 7
0 6 10 14
6 0 15 21
10 15 0 35
14 21 35 0
}.~.,
agora transformamos os números em uma lista, ,
obtemos os valores exclusivos ~.
e removemos o 0 no início}.
}.~.,(~:/**/)~2 3 5 7
6 10 14 15 21 35
y<:
uma comparação com a entrada original para verificar quais valores são válidos:
10<:6 10 14 15 21 35
1 1 0 0 0 0
+/
e depois some isso para obter a resposta.
+/1 1 0 0 0 0
2