Sao chép lên đến N


51

Cho một số n >= 2, xuất tất cả các số nguyên dương nhỏ hơn nvị trí gcd(n, k) == 1(với kbất kỳ một trong các số đầu ra). Số loại này là nguyên tố cùng nhau.

Ví dụ: 10đưa ra đầu ra [1, 3, 7, 9](dưới bất kỳ hình thức nào bạn thích, miễn là các số được phân tách rõ ràng và trong một số loại danh sách). Danh sách không thể có các mục trùng lặp và không phải sắp xếp.

Nhiều trường hợp thử nghiệm:

2 -> [1]
3 -> [1, 2]
6 -> [1, 5]
10 -> [1, 3, 7, 9]
20 -> [1, 3, 7, 9, 11, 13, 17, 19]
25 -> [1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19, 21, 22, 23, 24]
30 -> [1, 7, 11, 13, 17, 19, 23, 29]

Chúng tôi cũng không tính những con số ở trên nlà tương đương n, chỉ vì tôi khá chắc chắn có những giải pháp vô hạn.

Cũng lưu ý: Các số tương ứng với nhau cũng được cho là tương đối nguyên tố hoặc tương hỗ lẫn nhau.


Các chuỗi riêng biệt (ví dụ 1\n3\n) có được tính là đầu ra hợp lệ không?
devRicher

@devR Rich mà hoạt động, chắc chắn.
Rɪᴋᴇʀ

Trực giác về việc có một số lượng vô hạn các số trên n là số nguyên tố để n cảm thấy đúng với tôi. Có vô số số nguyên tố, và một số nguyên tố sẽ là số nguyên tố với mọi số bên dưới nó. Do đó, mọi số nguyên tố lớn hơn n (trong đó có vô số) cũng là một phần của danh sách đồng thời.
Brian J

@BrianJ Không chỉ vậy. Nếu cn là coprimes, c + knn cũng là coprimes, cho tất cả các số nguyên k .
Dennis

1
Thực tế thú vị: đây được gọi là tổng số .
Wojowu

Câu trả lời:


17

Thạch , 3 byte

gÐṂ

Hãy thử trực tuyến!

Cái này hoạt động ra sao?

gĐṂ - (Monadic) Chương trình đầy đủ.

g - ước số chung lớn nhất.
 ÐṂ - Giữ các phần tử có giá trị liên kết tối thiểu (nghĩa là các phần tử có GCD == 1)
       Lưu ý rằng điều này sẽ tự động tạo phạm vi [1, đầu vào] (đã bao gồm).

Bằng chứng về tính hợp lệ

Kể từ khi chúng tôi muốn trích xuất các coprimes chỉ, giá trị nhỏ nhất của danh sách Greatest-Common-ước được 1 cho ÐṂtrick để làm việc. Hãy chứng minh rằng (theo hai phương pháp khác nhau):

  1. Phạm vi được tạo ngầm, chứa và . Ước số chung lớn nhất luôn là số nguyên dương hoàn toàn, do đó được đảm bảo xảy ra và sẽ luôn là giá trị tối thiểu.[1,input]1gcd(1,x)=1xZ1

  2. Hai số nguyên dương liên tiếp luôn luôn là số nguyên. Hãy xem xét , với . Sau đó, chúng tôi lấy một số nguyên dương khác sao cho và . y = x + 1 k k x k yx,yZy=x+1kkxky

    Điều này ngụ ý rằng , vì vậy , do đó . Số nguyên dương duy nhất để chia là chính nó, vì vậy nó được đảm bảo xuất hiện trong danh sách và sẽ luôn là giá trị tối thiểu.k ( x + 1 - x ) k 1 1 1k(yx)k(x+1x)k111


2
Bạn đã vượt qua Dennis bằng ngôn ngữ của chính mình sau 9 tháng!
Adám

@ Adám Tôi không chắc liệu có ÐṂtồn tại trước đó không, dù sao tôi cũng khá hài lòng với cái này.
Ông Xcoder

2
Đối với hồ sơ, DṂđã tồn tại, nhưng nó chỉ làm việc cho các đơn nguyên. Các cam kết thực hiện Þ, ÐṂ, ÐṀcho những cặp đang ngày ngày 09 tháng 5, 2017.
Dennis

@Dennis Tôi biết có một lý do chính đáng tại sao bạn không có phiên bản 3 byte. Chúng tôi đã tự hỏi về điều đó trong trò chuyện quá, vì vậy cảm ơn về thông tin hữu ích!
Ông Xcoder

56

Python 2 , 61 47 byte

lambda n:[k/n for k in range(n*n)if k/n*k%n==1]

Hãy thử trực tuyến!

Lý lịch

Hãy xem xét vòng . Mặc dù vòng này thường được xác định bằng cách sử dụng các lớp dư modulo , nhưng nó cũng có thể được coi là tập , trong đó các toán tử cộng và nhân được xác định bởi và , trong đó biểu thị phép cộng thông thường, phép nhân và toán tử modulo trên các số nguyên.n Z n = { 0 , ... , n - 1 } một + n b = ( một + b )(Zn,+n,n)nZn={0,,n1}a+nb=(a+b)%n+ ,anb=ab%n+,, and %

Hai phần tử và của được gọi là phép nhân bội lẫn nhau modulo nếu . Lưu ý rằng bất cứ khi nào .b Z n n a n b = 1abZnn1anb=1%nn > 11%n=1n>1

Fix và để cho thể là một nguyên tố cùng nhau của trong . Nếu cho hai phần tử và của , chúng ta có . Điều này ngụ ý rằng và chúng tôi theo dõi , nghĩa là chia đều . Vì chia sẻ không có ước số nguyên tố với , điều này có nghĩa là . Cuối cùng, bởi vìa n Z n a n x = a n y x y Z n a xn>1anZnanx=anyxyZnmột ( x - y )ax%n=ay%nn | một ( x - y ) n một ( x - y ) n một n | x - y - n < x - y < n x = y một n 0 , ... , một n ( n - 1 ) Z n Z n n 1 b Za(xy)%n=ax%nay%n=0na(xy)na(xy)nanxyn<xy<n , chúng tôi kết luận rằng . Điều này cho thấy các sản phẩm là tất cả các yếu tố khác nhau của . Vì có chính xác phần tử, nên một (và chính xác một) trong số các sản phẩm đó phải bằng , nghĩa là, có một duy nhất trong sao cho .x=yan0,,an(n1)ZnZnn1 b a n b = 1Znanb=1

Ngược lại, sửa chữa và để cho thể là một yếu tố của đó là không nguyên tố cùng nhau với . Trong trường hợp này, có một số nguyên tố sao cho và . Nếu thừa nhận một nghịch đảo modulo nhân giống (chúng ta hãy gọi nó là ), chúng tôi có mà , có nghĩa là và do đó, , vì vậy . Vì , chúng tôi theo đóa Z n n p p a p n a n b a n b = 1 a bn>1aZnnppapnanbanb=1( a b - 1 )ab%n=1n a b - 1 p a p a b p n p a b - 1 p ( a b ) - ( a b - 1 ) = 1 p(ab1)%n=ab%n1=0nab1papab . Mặt khác, vì , chúng tôi cũng theo . Theo cách này, , điều này mâu thuẫn với giả định rằng là số nguyên tố.pnpab1p(ab)(ab1)=1p

Điều này chứng tỏ rằng các tuyên bố sau là tương đương khi .n>1

  • na và là nguyên tố cùng nhau.n

  • na thừa nhận một nghịch đảo modulo .n

  • na thừa nhận một độc đáo nghịch đảo modulo .n

Làm thế nào nó hoạt động

Đối với mỗi cặp số nguyên và trong , số nguyên là duy nhất; trong thực tế, và là thương số và phần còn lại của chia cho , tức là, với , chúng ta có thể phục hồi và , trong đó biểu thị phép chia số nguyên . Cuối cùng, vì và , là một phần tử của ; thực tế, .b Z n k : = a n + b a b k n k a = k / n b = kabZnk:=an+babknka=k/n/ a n - 1 b n - 1 k Z n 2 k ( n - 1 ) n + ( n - 1 ) = n 2 - 1b=k%n/an1bn1kZn2k(n1)n+(n1)=n21

Như đã lưu ý ở trên, nếu và là nguyên tố cùng nhau, sẽ có một duy nhất sao cho , tức là sẽ có một duy nhất sao cho và , do đó danh sách được tạo ra sẽ chứa đúng một lần.n b a banbk k / n = a k / n kab%n=1kk/n=aak/nk%n=(k/n)(k%n)%n=1a

Ngược lại, nếu và không phải là nguyên tố cùng nhau, điều kiện sẽ sai với tất cả các giá trị của sao cho , vì vậy danh sách được tạo sẽ không chứa .n k / n kank a = k / n ak/nk%n=1ka=k/na

Điều này chứng tỏ rằng danh sách lambda trả về sẽ chứa tất cả các số nguyên tố của trong chính xác một lần.Z nnZn


26
"GCD? Chúng ta sẽ đi đâu, chúng ta không cần GCD."
Rɪᴋᴇʀ

1
Ái chà. Đó là tất cả những gì tôi muốn viết, nhưng rõ ràng tôi cần 15 ký tự. Tuy nhiên, woah. Bạn đã làm rất tốt.
Eric Lagergren

24

Thạch , 4 byte

gRỊT

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

gRỊT  Main link. Argument: n

 R    Range; yield [1, ..., n].
g     Compute the GCD of n and each k in [1, ..., n].
  Ị   Insignificant; return 1 for GCDs less or equal to 1.
   T  Truth; yield the indices of all truthy elements.

33
Mã hóa trong ngôn ngữ này có một sốgRỊT
ETHproductions

1
Tôi đã quản lý (ab) sử dụng "Giá trị liên kết tối thiểu" quick ( ÐṂ) để có được 3 byte .
Ông Xcoder

14

Toán học, 25 byte

Range@#~GCD~#~Position~1&

Định dạng đầu ra hơi kỳ lạ, trong đó mỗi kết quả được gói trong một danh sách riêng, ví dụ {{1}, {3}, {7}, {9}}. Nếu điều đó không ổn, tôi đã có hai giải pháp ở mức 30 byte:

Select[Range[x=#],#~GCD~x<2&]&
#&@@@Range@#~GCD~#~Position~1&

Mathematica thực sự có CoprimeQnhưng đó là quá dài.


1
Qnghĩa là CoprimeQgì?
Conor O'Brien

2
@ ConorO'Brien "câu hỏi" tôi đoán. Tất cả các vấn đề quyết định được xây dựng kết thúc bằng Q như EvenQ, PrimeQhoặc SubsetQ.
Martin Ender

10

2sable , 4 byte

Mã số:

ƒN¿–

Giải trình:

ƒ       # For N in the range [0, input]..
 N¿     #   Compute the GCD of N and the input
   –    #   If 1, print N with a newline

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến!


Tốt công việc (gần như) đánh bại Dennis. (muộn vài phút).
Zacharý

10

Python, 93 82 74 byte

f=lambda a,b:f(b,a%b)if b else a<2
lambda c:[i for i in range(c)if f(i,c)]

fkiểm tra đệ quy các coprimes và lambda thứ hai tạo ra chúng. Xuất ra một danh sách.


7

Trên thực tế , 8 byte

;╗R`╜┤`░

Hãy thử trực tuyến!

Giải trình:

;╗R`╜┤`░
  R`  `░  elements of range(1, n+1) where
;╗  ╜     n and the element
     ┤    are coprime

1
Tôi tin rằng bạn có thể làm range(1, n)nếu điều đó tiết kiệm bất kỳ byte nào.
Sản xuất ETH

1
@ETHproductions Nó không. Hai tùy chọn là R( range(1, n+1)) và r( range(n)). Vì chúng tương đương nhau, tôi đã chọn R(vì tôi vô tình nhấn mũ khóa trong khi viết mã).
Mego

Vâng, đó là những gì tôi đã tìm ra. Tôi đã không thấy một hướng dẫn dường như dành riêng cho việc tăng dần, nhưng tôi nghĩ dù sao cũng có thể có một hướng dẫn
ETHproductions



6

JavaScript (ES6), 64 61 byte

Đã lưu 3 byte nhờ @ user81655

n=>[...Array(n).keys()].filter(b=>(g=a=>b?g(b,b=a%b):a<2)(n))

Kiểm tra đoạn

f=n=>[...Array(n).keys()].filter(b=>(g=a=>b?g(b,b=a%b):a<2)(n))

for(var i = 2; i < 50; i++) console.log(i + ":", `[${ f(i) }]`);


Bạn không thể trao đổi a==với a<2?
Rɪᴋᴇʀ

@EasterlyIrk Không chắc chắn, acó thể là 0 tại một số điểm. Tôi sẽ phải kiểm tra
ETHproductions

Bạn có thể di chuyển chức năng GCD vào filterđể loại bỏ nhu cầu nhận btham số:...keys()].filter(b=>(g=a=>b?g(b,b=a%b):a<2)(n))
user81655

@ user81655 Thật tuyệt, cảm ơn! :-)
Sản phẩm ETH

6

Sứa , 19 18 byte

p
[#
`B
&~xr1
NnEi

Điều này hoạt động bằng cách tính toán hệ số nguyên tố của mọi số trong phạm vi và kiểm tra xem nó có giao nhau với đầu vào không (Jellyfish chưa có nội dung gcd chưa). Vì lý do chơi gôn, đầu ra theo thứ tự giảm dần. Hãy thử trực tuyến!

Giải trình

Trước hết, iđược đánh giá đầu vào; đối với đầu vào 10, giá trị của i-cell là 10.

r1
i

Ở đây r(phạm vi) được áp dụng cho đầu vào và 1. Vì đầu vào lớn hơn 1, nên phạm vi theo thứ tự giảm dần; cho đầu vào 10, điều này mang lại [9 8 7 6 5 4 3 2 1].

[#
`B
&~x
Nn

Phần này là một chức năng lớn, được đánh giá trên ivà phạm vi trên.

~x
n

Giao điểm ( n) của các thừa số nguyên tố ( x).

&~x
Nn

Nó có trống không ( N)

`
&~x
Nn

Chủ đề đến cấp 0, kiểm tra cho từng yếu tố của phạm vi.

[#
`B
&~x
Nn

Lọc ( #) phạm vi liên quan đến danh sách booleans này. Hàm được tạo bởi [muốn sử dụng đối số làm đối số #của chính nó, vì vậy chúng tôi đặt một Bkhối để #không nhận bất kỳ đối số nào. Mặt khác, giá trị của ~-cell sẽ được sử dụng làm đối số của hàm lớn. Cuối cùng, pin kết quả.


5

Xếp chồng, không lọc, 24 21 byte

Đã lưu 3 byte, lấy cảm hứng từ viên ruby ​​của Borsunho . ( 1 eqđến 2<)

{!n:>1+:n gcd 2<keep}

Hãy thử nó ở đây!

Đây là một n-lambda có một đối số duy nhất và mang lại mảng.

{!n:>1+:n gcd 2<keep}
{!                  }  n-lambda
  n                    push n
   :>                  range [0, n)
     1+                range [1, n]
       :               duplicate
        n gcd          element-wise gcd with n
              2<       element-wise equality with 1
                       this yields the range [1, n] and a boolean mask of coprime numbers
                keep   then, we simply apply the mask to the range and keep coprimes.

Tại sao điều này không thành phần?
Zacharý

@ZacharyT chủ yếu, keepđã không hoạt động tốt.
Conor O'Brien

5

CJam , 14 byte

{:X{Xmff%:*},}

Hãy thử trực tuyến!

Giải trình

Chúng tôi không cần kiểm tra tất cả các ước số có thể có abkiểm tra xem chúng có phải là nguyên tố không. Nó đủ để xem xét liệu có bất kỳ yếu tố chính nào của sự bphân chia hay không a.

:X     e# Store the input in X.
{      e# Filter the list [0 1 ... X-1] by the results of this block...
  Xmf  e#   Get the prime factors of X.
  f%   e#   Take the current value modulo each of those prime factors.
  :*   e#   Multiply the results. Iff any of them divide the current
       e#   value, there's a 0 in the list, and the result of the product
       e#   is also 0, dropping the value from the resulting list.
},

5

Toán học, 26 byte

Pick[r=Range@#,r~GCD~#,1]&

1
Ohhhh, tôi đã tìm kiếm một cái gì đó như Pick. Tôi đoán bây giờ tôi rất vui vì tôi đã không tìm thấy nó. ;) Nhưng nó sẽ rất hữu ích cho những thách thức trong tương lai.
Martin Ender


4

Brachylog , 16 13 byte

>.$p'(e:A*?),

Đây là một hàm lấy N làm đầu vào và tạo ra tất cả các số nguyên nhỏ hơn và đồng thời với nó.

Hãy thử trực tuyến! Như thường thấy trong Brachylog, điều này đã có thêm mã được thêm vào để biến chức năng thành một chương trình đầy đủ; Trình thông dịch của Brachylog, nếu được cung cấp một chức năng chứ không phải là một chương trình đầy đủ, sẽ chạy nó nhưng không in đầu ra, điều đó có nghĩa là bạn không thể thực sự quan sát hoạt động của nó.

Giải trình:

Một chương trình Brachylog là một chuỗi các ràng buộc; thông thường, LHS của một ràng buộc là RHS của ràng buộc tiếp theo.

>.$p'(e:A*?),
>              The input is greater than
 .             the output, whose
  $p           prime factorisation does
    '(     )   not obey the following constraint:
      e        it has an element which
       :A*     can be multiplied by something to
          ?    produce the input.
            ,  (This comma turns off an unwanted implicit constraint.)

Golfed xuống ba nhân vật bằng cách nhận ra không có lý do gì để kiểm tra xem nếu các yếu tố thông thường (mà đã được biết đến là một yếu tố chính của đầu ra) là một thủ yếu tố đầu vào. Chúng tôi đã biết nó là chính, vì vậy chúng tôi chỉ có thể kiểm tra nếu đó là một yếu tố. Ở đây tôi rất ngạc nhiên khi :A*?không gửi trình thông dịch vào một vòng lặp vô hạn không cho phép giá trị không nguyên cho A , nhưng vì trình thông dịch làm những gì tôi muốn, tôi sẽ lấy nó.


4

APL Dyalog, 10 byte .

0~⍨⍳×1=⊢∨⍳

Giải thích (đầu vào n):

0~⍨⍳×1=⊢∨⍳
         ⍳ - 1 ... n (Thus, ⎕IO is 1)
       ⊢∨  - Each GCD'd by n
     1=    - Test equality with 1 on each element
   ⍳×      - multiplied by its index
0~⍨        - without 0.

3
Tôi thích cách mã APL trông giống như khuôn mặt bạn tạo ra khi bạn đọc nó.
DJMcMayhem

Đúng, và nó phá hủy hầu hết mọi ngôn ngữ không theo định hướng golf. :).
Zacharý

Tại sao chỉ "có thể" làm việc?
Rɪᴋᴇʀ

Tôi sẽ giả sử nó hoạt động.
Zacharý

@ZacharyT tại sao bạn không thể kiểm tra nó? Khi tôi dán nó vào try-apl.org, nó có lỗi với mã thông báo không hợp lệ.
Rɪᴋᴇʀ

4

Japt -f , 9 8 5 2 byte

jN

Thử nó

  • 2 byte được lưu nhờ ETH chỉ ra một bộ não, dẫn đến một byte khác được lưu.

Bạn có thể làmo f_jU
ETHproductions

Cảm ơn, @ETHproductions. Không biết tôi đang nghĩ gì ở đây! Phải là một trong những (nhiều) khoảnh khắc mà tôi quên jcũng có thể được sử dụng để kiểm tra nếu 2 số là số nguyên tố.
Xù xì

3

Toán học, 33 byte

xSelect[Range@x,x~CoprimeQ~#&]

Chứa U + F4A1


Những gì không thể in được làm gì?
Rɪᴋᴇʀ

3
@EasterlyIrk giới thiệu một hàm không tên với một đối số được đặt tên. nó được kết xuất như một mũi tên trong Mma.
Martin Ender

@MartinEnder oh, tuyệt.
Rɪᴋᴇʀ

U + F4A1 là một ký tự sử dụng riêng. Như Martin đã nói, nó được biểu hiện như một mũi tên trong Mathematica.
Zacharý



3

memes , 11 byte không cạnh tranh , lỗi thời

Không cạnh tranh như lặp lại của STDIN là mới. Sử dụng mã hóa UTF-8.

d`}}]i=1?ip

Giải trình:

d     Set program to not output result
`}    Loop next input-times
}]i   GCD of input and loop index
=1?   Is it equal to 1? If yes,
ip    Print out loop index

}truy cập mục đầu vào tiếp theo, nhưng đầu vào cuối cùng được lặp qua khi được đưa ra, do đó, việc nhập 6sẽ dẫn đến kết quả là 6 6 6 6 6 ...trong STDIN, giúp đọc hai đầu ra từ một.


Bạn vừa tạo lang này hôm nay? Nếu nó được thực hiện trước thử thách, nó phải không cạnh tranh.
Rɪᴋᴇʀ

@EasterlyIrk Nó đã được thực hiện 3 ngày trước, tôi chỉ liên tục làm việc với nó. Ngoài ra, tôi giả sử bạn có nghĩa là sau ?
devRicher

Vâng, đánh máy cảm ơn. Và không sao, miễn là các tính năng được sử dụng trong câu trả lời và cũ hơn thử thách.
Rɪᴋᴇʀ

@EasterlyIrk Tôi thấy, trong trường hợp đó tôi sẽ phải chỉnh sửa câu trả lời của mình.
devRicher

Ừ, xin lỗi. : /
Rɪᴋᴇʀ


2

Ruby, 36 34

->n{n.times{|i|p i if i.gcd(n)<2}}

Phải thừa nhận rằng đây không phải là câu trả lời rất truyền cảm .

2 byte được lưu nhờ Conor O'Brien.


Bạn có thể tắt hai byte bằng cách xóa dấu ngoặc đơn xung quanh(n)
Conor O'Brien

2

Python 3 , 60 byte

Nhập gcd thay vì viết lambda mới cho nó. Gợi ý chơi golf chào mừng. Hãy thử trực tuyến!

import math
lambda c:[i for i in range(c)if math.gcd(c,i)<2]

Tôi không nghĩ bạn có thể chơi gôn này nhiều hơn. Nhập gcd trực tiếp hoặc toán học vì m đều thêm byte.
Rɪᴋᴇʀ

2

Julia, 30 byte

n->filter(x->(gcd(n,x)<2),1:n)

Chức năng ẩn danh. filterloại bỏ các yếu tố khỏi danh sách không trung thực theo chức năng.

Trong trường hợp này, hàm là x->(gcd(n,x)<2)(đúng nếu gcd của đầu vào và phần tử danh sách nhỏ hơn 2). Danh sách này là phạm vi 1:n.


2

PARI / GP , 27 byte

n->[k|k<-[1..n],gcd(k,n)<2]

Điều này sử dụng ký hiệu thiết lập được giới thiệu trong phiên bản 2.6.0 (2013). Trong các phiên bản trước, cần thêm bốn byte:

n->select(k->gcd(k,n)<2,[1..n])

sẽ là cần thiết


Cái này hoạt động ra sao?
Rɪᴋᴇʀ

1
@EasterlyIrk Giống như hầu hết các bài nộp này - tạo phạm vi từ 1 đến n ( [1..n]), kiểm tra xem gcd có phải là 1 ( gcd(n,k)<2) không, trả về các số có thuộc tính này. Các ->là ký hiệu chức năng / đóng cửa, ngắn hơn bởi 2 byte so với cú pháp chức năng bình thường và [...|...<-...,...]là ký hiệu bộ giải thích trong câu trả lời (xem phần 2.3.14 tại của Hướng dẫn sử dụng, hoặc tìm kiếm <-).
Charles



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.