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
Gracias a FUZxxl .
Prueba de rendimiento
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 │ │
└───────┴──────┴────────┴────────┴─────┴────┴───┘
No soy un teórico como se ha visto aquí en el pasado, pero creo que la complejidad del tiempo es algo así como O (n p 2 ) donde n p es el número de primos hasta e incluyendo el número de entrada n. Esto se basa en la suposición de que la complejidad de mi método (generar una tabla de multiplicación muy grande) supera con creces la complejidad de la función generadora principal incorporada en J.
Explicación
f=:3 :'...'
declara un verbo (función) monádico. La entrada al verbo está representada por y
dentro de la definición del verbo.
p:i._1&p:y
El p:
verbo es los números primos de usos múltiples verbo, y se utiliza de dos maneras diferentes aquí: _1&p:y
devuelve el número de primos menos de y
entonces p:i.
genera cada uno de ellos. Usando 10 como entrada:
p:i._1&p:10
2 3 5 7
(~:/**/)~
genera la tabla de la que hablé anteriormente. */
genera una tabla de multiplicación, ~:/
genera una tabla no igual (para eliminar los cuadrados) y ambos se multiplican juntos. Usando nuestra salida 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
}.~.,
ahora convertimos los números en una lista, ,
obtenemos los valores únicos ~.
y eliminamos el 0 al comienzo}.
}.~.,(~:/**/)~2 3 5 7
6 10 14 15 21 35
y<:
Una comparación con la entrada original para verificar qué valores son válidos:
10<:6 10 14 15 21 35
1 1 0 0 0 0
+/
y luego sume eso para obtener la respuesta.
+/1 1 0 0 0 0
2