Đếm chuỗi Cickyham


14

Số nguyên tố luôn mê hoặc mọi người. 2300 năm trước Euclid đã viết trong "Các yếu tố" của mình

Một số nguyên tố là số được đo bằng một đơn vị.

có nghĩa là một số nguyên tố chỉ chia hết cho 1(hoặc bởi chính nó).

Mọi người luôn tìm kiếm mối quan hệ giữa các số nguyên tố và đã đưa ra một số thứ khá kỳ lạ (như trong "thú vị").

Ví dụ một số nguyên tố Sophie Germain là số nguyên tố p2*p+1cũng là số nguyên tố.

Một số nguyên tố an toàn là số nguyên tố p(p-1)/2cũng là số nguyên tố, mà là chính xác ngược tình trạng của một số nguyên tố Sophie Germain.

Những điều này có liên quan đến những gì chúng tôi đang tìm kiếm trong thử thách này.

Một chuỗi Cickyham loại I là một chuỗi các số nguyên tố, trong đó mọi phần tử ngoại trừ phần tử cuối cùng là một số nguyên tố Sophie Germain và mọi phần tử ngoại trừ phần tử đầu tiên là một số nguyên tố an toàn . Số lượng phần tử trong chuỗi này được gọi là chiều dài của nó .

Điều này có nghĩa là chúng ta bắt đầu với một số nguyên tố pvà tính toán q=2*p+1. Nếu qcũng là số nguyên tố, chúng ta có chuỗi Cunnigham loại I có độ dài 2. Sau đó, chúng tôi kiểm tra 2*q+1và cứ thế, cho đến khi số được tạo tiếp theo là hợp số.

Chuỗi Cickyham loại II được xây dựng theo nguyên tắc gần như giống nhau, sự khác biệt duy nhất là chúng tôi kiểm tra 2*p-1ở mỗi giai đoạn.

Chuỗi Cickyham có thể có độ dài 1 , có nghĩa là cả 2 * p + 1 và 2 * p-1 đều không phải là số nguyên tố. Chúng tôi không quan tâm đến những điều này .

Một số ví dụ về chuỗi Cickyham

2bắt đầu một chuỗi loại I có chiều dài 5.

2, 5, 11, 23, 47

Số được xây dựng tiếp theo sẽ 95không phải là số nguyên tố.
Điều này cũng cho chúng ta biết, rằng 5, 11, 2347không bắt đầu bất kỳ chuỗi kiểu tôi , bởi vì nó sẽ có những yếu tố preceeding.

2cũng bắt đầu một chuỗi loại II có độ dài 3.

2, 3, 5

Tiếp theo sẽ là 9, không phải là chính.

Hãy thử 11loại II (chúng tôi đã loại nó khỏi loại I trước đó).
Chà, 21sẽ là tiếp theo, không phải là chính, vì vậy chúng tôi sẽ có độ dài 1 cho "chuỗi" đó, mà chúng tôi không tính trong thử thách này.

Thử thách

Viết một chương trình hoặc chức năng đó, đưa ra một số nnhư là đầu vào, viết / trả về số bắt đầu của thứ n chuỗi Cunningham của loại I hoặc II của ít nhất chiều dài 2 , tiếp theo là một dấu cách, tiếp theo là loại chuỗi nó bắt đầu ( tôi hoặc II ), theo sau là dấu hai chấm, theo sau là độ dài của loại chuỗi đó. Trong trường hợp một số nguyên tố bắt đầu cả hai loại chuỗi (loại I loại II), chuỗi loại I được tính trước.

Thí dụ: 2 I:5

Hãy nhớ rằng, đó ncó thể là một phần của chuỗi đã bắt đầu trước đó thuộc bất kỳ loại nào, trong trường hợp đó, nó không nên được coi là số bắt đầu của chuỗi loại đó.

Hãy xem xét điều này bắt đầu như thế nào

Chúng tôi bắt đầu với 2. Vì nó là số nguyên tố đầu tiên, chúng ta có thể chắc chắn rằng không có chuỗi nào bắt đầu bằng một số nguyên tố thấp hơn có chứa 2.
Số tiếp theo trong một chuỗi loại tôi sẽ là 2*2+1 == 5. 5là số nguyên tố, vì vậy chúng tôi có một chuỗi có độ dài ít nhất là 2.
Chúng tôi coi đó là chuỗi đầu tiên. Còn loại II thì sao? Số tiếp theo sẽ là 2*2-1 == 3. 3là số nguyên tố, do đó, một chuỗi có độ dài ít nhất là 2 cho loại II.
Chúng tôi tính đó là chuỗi thứ hai. Và chúng tôi đã hoàn thành 2.

Nguyên tố tiếp theo là 3. Ở đây chúng ta nên kiểm tra xem nó có nằm trong chuỗi mà một số nguyên tố thấp hơn bắt đầu không.
Kiểm tra loại I : (3-1)/2 == 1. 1không phải là số nguyên tố, vì vậy 3 có thể là điểm khởi đầu cho một chuỗi loại I.
Hãy kiểm tra xem. Tiếp theo sẽ là 3*2+1 == 7. 7là số nguyên tố, vì vậy chúng tôi có một chuỗi loại I có độ dài ít nhất là 2. Chúng tôi tính đó là chuỗi thứ ba.
Bây giờ chúng tôi kiểm tra xem có 3xuất hiện trong chuỗi loại II không bắt đầu một số nguyên tố thấp hơn. (3+1)/2 == 2. 2là số nguyên tố, vì vậy 3 không thể được coi là số bắt đầu cho chuỗi loại II. Vì vậy, điều này không được tính, ngay cả khi số tiếp theo sau 3trong chuỗi này, sẽ là5, là số nguyên tố. (Tất nhiên chúng tôi đã biết điều đó, và tất nhiên bạn có thể và nên nghĩ về phương pháp của riêng bạn cách thực hiện các kiểm tra này.)

Và như vậy chúng tôi kiểm tra trên cho 5, 7, 11và như vậy, đếm đến khi chúng tôi tìm ra chuỗi Cunningham thứ n của ít nhất chiều dài 2.

Sau đó (hoặc có thể sớm hơn một chút ;)), chúng tôi cần xác định độ dài hoàn chỉnh của chuỗi chúng tôi đã tìm thấy và in kết quả theo định dạng đã đề cập trước đó.

Nhân tiện: trong các thử nghiệm của tôi, tôi không tìm thấy bất kỳ số nguyên tố nào ngoài việc 2bắt đầu cả hai loại chuỗi có độ dài lớn hơn 1.

Ví dụ đầu vào / đầu ra

Đầu vào

1

Đầu ra

2 I:5


Đầu vào

10

Đầu ra

79 II:3


Đầu vào

99

Đầu ra

2129 I:2


Các đầu ra cho đầu vào 1..20

2 tôi: 5
2 II: 3
3 tôi: 2
7 II: 2
19 II: 3
29 tôi: 2
31 II: 2
41 tôi: 3
53 tôi: 2
79 II: 3
89 tôi: 6
97 II: 2
113 tôi: 2
131 I: 2
139 II: 2
173 tôi: 2
191 tôi: 2
199 II: 2
211 II: 2
229 II: 2

Một danh sách 5000 đầu ra đầu tiên có thể được tìm thấy ở đây .

Đây là mã golf. Khoảng trắng tùy ý được phép trong đầu ra, nhưng loại và số phải được phân tách bằng một khoảng trắng và dấu hai chấm như trong các ví dụ. Sử dụng bất kỳ sơ hở không được cho phép, đặc biệt là nhận được kết quả từ các trang web đang không được phép.

Chúc may mắn :)


3
Quên đề cập đến trong hộp cát: thật dễ dàng để chứng minh điều đó 23là số nguyên tố duy nhất pmà cả hai 2p-12p+1đều là số nguyên tố, do đó, là số nguyên tố 2duy nhất bắt đầu chuỗi Cickyham không tầm thường của cả hai loại.
Peter Taylor

Được chứ. Cảm ơn sự giúp đỡ của bạn:)
Cabbie407

3
(Chuyển đổi nhận xét từ câu trả lời.) Không bất kỳ số nguyên tố nào ngoài 2chiều dài chuỗi kép lớn hơn 1. Đây là một bằng chứng bằng cách loại bỏ.
pbeentje

Vâng cảm ơn đã chỉ ra rằng trong chi tiết như vậy một lần nữa. Bạn chỉ muốn nhận xét điều đó hay bạn nghĩ tôi nên thay đổi thử thách bằng cách nào đó vì điều này?
Cabbie407

Chỉ một nhận xét. Tôi không nghĩ rằng nó thay đổi thử thách trong mọi trường hợp, chỉ có khả năng hữu ích cho việc chơi gôn: khi tìm thấy một chuỗi, chuỗi kia không cần phải kiểm tra.
pbeentje

Câu trả lời:


2

Javascript, 236 208 byte

Đã lưu 28 byte:

p=(n,i=n)=>n%--i?p(n,i):i==1;f=n=>{for(k=2,c=0;c<n;k++){p(k)&&!p((k-1)/2)&&p(2*k+1)&&(c++,l=1,r='');p(k)&&c-n&&!p((k+1)/2)&&p(2*k-1)&&(c++,l=-1,r='I');};alert(--k+` I${r}:`+eval(`for(j=1;p(k=2*k+l);j++);j`))}

Lưu 9 byte trên pchức năng với: p=(n,i=n)=>n%--i?p(n,i):i==1
Các tchức năng được thay thế bằng eval(...)tuyên bố trực tiếp trong fchức năng.


Giải pháp trước đây:

p=n=>{for(i=n;n%--i&&i;);return 1==i};t=(n,m)=>{for(j=1;p(n=2*n+m);j++);return j};f=n=>{for(k=2,c=0;c<n;k++){p(k)&&!p((k-1)/2)&&p(2*k+1)&&(c++,l=1,r='');p(k)&&c-n&&!p((k+1)/2)&&p(2*k-1)&&(c++,l=-1,r='I');};alert(--k+` I${r}:${t(k,l)}`)}

Thí dụ: f(6)

Đầu ra: 29 I:2

Giải thích
Tôi đang sử dụng 3 chức năng

1 p : để biết nếu n là số nguyên tố: p=n=>{for(i=n;n%--i&&i;);return 1==i}

2 t : để biết độ dài của chuỗi Cickyham bắt đầu bằng n loại I hoặc II tùy thuộc vào tham số m sẽ là 1 hoặc -1: t=(n,m)=>{for(j=1;p(n=2*n+m);j++);return j}

3 f : đếm chuỗi ( cho vòng lặp ) sau đó hiển thị kết quả

f=n=>{for(k=2,c=0;c<n;k++){p(k)&&!p((k-1)/2)&&p(2*k+1)&&(c++,l=1,r='');p(k)&&c-n&&!p((k+1)/2)&&p(2*k-1)&&(c++,l=-1,r='I');};alert(--k+` I${r}:${t(k,l)}`)}

đối với vòng lặp : đối với mỗi số, chuỗi Cickyham (I rồi II nếu cần) là hợp lệ nếu

  • số là số nguyên tố
  • tiền thân không phải là chính
  • người kế vị là chính
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.