J, 50 40 38 37 ký tự
f=:3 :'+/y<:}.~.,(~:/**/)~p:i._1&p:y'
Sử dụng:
f 1
0
f 62
18
f 420
124
f 10000
2600
Cảm ơn FUZxxl .
Kiểm tra hiệu suất
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 │ │
└───────┴──────┴────────┴────────┴─────┴────┴───┘
Tôi không phải là nhà lý thuyết như đã thấy ở đây trong quá khứ, nhưng tôi nghĩ rằng độ phức tạp thời gian là một cái gì đó giống như O (n p 2 ) trong đó n p là số lượng các số nguyên tố lên đến và bao gồm cả số đầu vào n. Điều này dựa trên giả định rằng độ phức tạp của phương thức của tôi (tạo bảng nhân rất lớn) vượt xa độ phức tạp của hàm tạo nguyên tố được xây dựng trong J.
Giải trình
f=:3 :'...'
tuyên bố một động từ (monadic) (chức năng). Đầu vào của động từ được thể hiện bởi y
trong định nghĩa động từ.
p:i._1&p:y
Các p:
động từ là số nguyên tố đa mục đích động từ, và nó được sử dụng theo hai cách khác nhau ở đây: _1&p:y
trả về số nguyên tố ít hơn y
sau đó p:i.
tạo ra mỗi một trong số họ. Sử dụng 10 làm đầu vào:
p:i._1&p:10
2 3 5 7
(~:/**/)~
tạo bảng tôi đã nói trước đó. */
tạo bảng nhân, ~:/
tạo bảng không bằng nhau (để loại bỏ các ô vuông) và cả hai bảng này được nhân với nhau. Sử dụng đầu ra trước đây của chúng tôi làm đầu vào:
*/~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
}.~.,
bây giờ chúng ta biến các số thành một danh sách ,
lấy các giá trị duy nhất ~.
và xóa 0 khi bắt đầu}.
}.~.,(~:/**/)~2 3 5 7
6 10 14 15 21 35
y<:
so sánh với đầu vào ban đầu để kiểm tra giá trị nào là hợp lệ:
10<:6 10 14 15 21 35
1 1 0 0 0 0
+/
và sau đó tổng hợp để có được câu trả lời.
+/1 1 0 0 0 0
2