Hình vuông Modulo huyền diệu


11

Tôi là một fan hâm mộ lớn của lý thuyết số. Một điều lớn trong lý thuyết số là số học mô-đun; định nghĩa là khi và chỉ khi . Một điều thú vị cần làm là nâng cao sức mạnh: đặc biệt khi mô đun là số nguyên tố. Cụ thể, người ta đã chứng minh rằng nếu và tương đối nguyên tố (chia sẻ không có yếu tố chung nào ngoài ) thì tồn tại một số sao cho .abmodmmabam1eae1modm

Tôi sẽ giải thích những gì bài tập là một ví dụ. Hãy lấy một mô đun . Một đầu ra có thể của chương trình hoặc chức năng sẽ là:m=7

3 2 6 4 5 1
2 4 1 2 4 1
6 1 6 1 6 1
4 2 1 4 2 1
5 4 6 2 3 1
1 1 1 1 1 1

Mỗi hàng là một danh sách các quyền hạn của số đầu tiên trong hàng đó: hàng đầu tiên là 3,32,33,,36 , tương đương với 3,2,6,4,5,1 modulo 7 . Hàng thứ hai của hình vuông ở trên là lũy thừa của 2 , vân vân, cho đến hàng cuối cùng, chỉ là lũy thừa của 1 .

Đây là một hình vuông modulo huyền diệu bởi vì:

  • Hình vuông đối xứng; đó là, cột thứ i giống như hàng thứ i .
  • Tất cả các giá trị 1 đến m1 xuất hiện ít nhất một lần.

Dưới đây là đầu ra hợp lệ duy nhất khác cho m=7 , bắt đầu với quyền hạn 5 :

5 4 6 2 3 1
4 2 1 4 2 1
6 1 6 1 6 1
2 4 1 2 4 1
3 2 6 4 5 1
1 1 1 1 1 1

Các thách thức

Tạo một hàm hoặc chương trình cung cấp một số nguyên tố pđầu ra một hình vuông modulo huyền diệu, nghĩa là một hình vuông có độ dài cạnh p-1, sao cho mỗi hàng là một danh sách các lũy thừa liên tiếp của phần tử đầu tiên trong hàng và tương tự cho các cột. Tất cả các số giữa 0pphải xảy ra và hình vuông chỉ có thể chứa các số trong phạm vi đó.

Đầu vào là một số hoặc một chuỗi và đầu ra có thể là ascii, một ma trận, một mảng các mảng (bất kỳ định dạng hợp lý nào).

Đây là môn đánh gôn, vì vậy đoạn mã ngắn nhất sẽ thắng.


Trình tự OEIS liên quan: A001918 (giá trị hợp lệ thấp nhất cho góc trên cùng bên trái).
Arnauld

2
" Tôi sẽ giải thích bài tập là gì qua một ví dụ. " Đừng. Giải thích nó theo cách riêng của nó và sau đó đưa ra một ví dụ để minh họa. Tôi nghĩ rằng những gì bạn yêu cầu là một ma trận sao cho là một modulo gốc nguyên thủy và , nhưng đó là rất nhiều nỗ lực để trích xuất đặc điểm kỹ thuật đó từ câu hỏi. AA1,1pAi,j=A1,1ijmodp
Peter Taylor

2
@PeterTaylor đúng, và đó là điều tôi muốn nói, nhưng trước hết, điều đó làm hỏng một phần của niềm vui khám phá, và thứ hai, nó dựa vào kiến ​​thức về gốc rễ nguyên thủy và số học mô-đun. Tôi muốn câu hỏi này có thể trả lời được bởi một đối tượng rộng hơn thế, vì vậy tôi đã cố gắng giải thích những gì tôi muốn nói theo cách dễ dàng hơn.
vrugtehagel

Câu trả lời:


5

Thạch , 13 10 byte

-3 cảm ơn Nick Kennedy

Cảm thấy như mã lặp đi lặp lại nên là golf-thể, nhưng tôi đã không quản lý việc d nó ...

*€Ṗ%µQƑƇḢị

Hãy thử trực tuyến! (chân trang định dạng đẹp như một lưới)

Làm sao?

*€Ṗ%µQƑƇḢị - Link: integer, p
 €         - for each n in [1..p]
*          -   exponentiate with:
  Ṗ        -     pop = [1..p-1]
           - ...i.e [[1^1,1^2,...,1^(p-1)],[2^1,2^2,...,2^(p-1)],...,[....,p^(p-1)]]
   %       - modulo p
    µ      - start a new monadic chain (call that list of lists X)
       Ƈ   - keep those which:
      Ƒ    -   are invariant under:
     Q     -     de-duplicate
        Ḣ  - head
         ị - index into the list of lists X


Ahha, bây giờ tôi cảm thấy chậm; p cảm ơn!
Jonathan Allan

3

Than , 36 byte

≔E…¹θ﹪Xι…¹θIθηE⊟Φη⁼¹№ι¹⪫E§η⊖ι◧IλL⊖θ 

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Lưu ý: Không gian lưu trữ. Giải trình:

≔E…¹θ﹪Xι…¹θIθη

Tạo p-1bởi p-1hàng loạt các quyền hạn của 1..p-1để chỉ số 1..p-1(modulo p).

E⊟Φη⁼¹№ι¹

Bản đồ trên một trong những hàng có chính xác một 1.

⪫E§η⊖ι◧IλL⊖θ 

Sắp xếp lại các hàng theo thứ tự được đưa ra bởi hàng đã chọn và định dạng đầu ra.




2

JavaScript (ES7),  91  86 byte

Phiên bản này cố gắng tính toán các quyền hạn trước khi áp dụng modulo và sẽ thất bại cho vì mất độ chính xác. Đó là cách khác sử dụng logic tương tự như phiên bản nhận xét bên dưới.p11

f=(p,k)=>(g=k=>[...Array(i=p-1)].map(_=>k**++i%p))(k).sort()[1]>1?g(k).map(g):f(p,-~k)

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


JavaScript (ES6),  92  87 byte

Phiên bản này sử dụng lũy ​​thừa mô-đun để hỗ trợ (nhiều) giá trị đầu vào cao hơn.

f=(p,k)=>(g=k=>[...Array(p-1)].map(_=>n=n*k%p,n=1))(k).sort()[1]>1?g(k).map(g):f(p,-~k)

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

Làm sao?

Tìm hàng đầu tiên

Cho , chúng tôi sử dụng hàm trợ giúp để tính cho .1k<pgak(n)=knmodp1n<p

g = k =>              // k = input
  [...Array(p - 1)]   // generate an array of size p - 1
  .map(_ =>           // for each entry in there:
    n = n * k % p,    //   update n to (n * k) mod p
    n = 1             //   starting with n = 1
  )                   // end of map()

Chúng tôi tìm sao cho chỉ có một giá trị sao cho . Chúng tôi làm điều đó bằng cách sắp xếp mảng và kiểm tra nếu phần tử thứ 2 lớn hơn .knak(n)=11

g(k).sort()[1] > 1

Điều này hoạt động ngay cả theo thứ tự từ điển - đó là hành vi mặc định của sort()- bởi vì:

  • nếu có một số 's, tất cả họ sẽ được di chuyển về phía trước giống như họ sẽ theo trình tự như1
  • nếu chỉ có một đơn , 2 nd giá trị sẽ lớn hơn , không có vấn đề nếu nó thực sự là 2 nd giá trị theo thứ tự số hoặc không11

Thí dụ:

Với :p=17

  • với , chúng tôi nhận được: k=1
    • a1=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
    • được sắp xếp theo[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
  • với , chúng tôi nhận được: k=2
    • a2=[2,4,8,16,15,13,9,1,2,4,8,16,15,13,9,1]
    • được sắp xếp theo[1,1,13,13,15,15,16,16,2,2,4,4,8,8,9,9]
  • với , chúng tôi nhận được: k=3
    • a3=[3,9,10,13,5,15,11,16,14,8,7,4,12,2,6,1]
    • được sắp xếp theo[1,10,11,12,13,14,15,16,2,3,4,5,6,7,8,9]

Xây dựng ma trận

Khi chúng tôi tìm thấy , chúng tôi gọi lại (để lấy phiên bản chưa sắp xếp của mảng) và gọi trên mỗi phần tử của để xây dựng các hàng của ma trận.kg(k)gg(k)

Phần này có thể được viết đơn giản là:

g(k).map(g)

.indexOf(1)>p-3tiết kiệm hơn 3 byte .every.
Neil

@Neil Cảm ơn. Nhưng tôi đã tìm thấy một cách ngắn hơn sau một giấc ngủ ngon. :)
Arnauld

2

Zsh , 117 90 byte

b=$1
c=(eval set -- '$[x**'{1..$[b-1]}%b\])
for ((;${#${(u)@}}-b+1;++x))$c
for x;$c&&<<<$@

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

Xin Chúa thương xót tâm hồn tôi. Có rất nhiều thực hành xấu được gói gọn ở đây, hãy để tôi giải thích người phạm tội lớn nhất ít nhất:

c=(eval set -- '$[x**'{1..$[b-1]}%b\])
                      {1..$[b-1]}        # brace expansion, expands immediately
               '$[x**'           %b\]    # string literals, expand during eval
   eval set --                           # sets the positional parameters
c=(                                   )  # defines c to the words contained

Ví dụ cho b=4:

c=(eval set -- '$[x**'{1..$[b-1]}%b\])
c=(eval set -- '$[x**'{1..3}%b\]     )                # $[b-1] => 3
c=(eval set -- '$[x**1%b]' '$[x**2%b]' '$[x**3%b]' )  # brace expansion

Cuối cùng, nơi $cxuất hiện trong phần còn lại của chương trình, các phần tử mảng được đánh giá là eval set -- .....

Cuối cùng, ${#${(u)@}}đếm các phần tử duy nhất trong các tham số vị trí (nghĩa là: có chu kỳ / có 1s không?)

Nhận xét liên quan đến câu trả lời 117 byte dưới đây.


Những thách thức chúng ta phải vượt qua:

  • Không có mảng đa chiều hoặc lồng nhau. Thay vào đó, chúng tôi in ra các chuỗi khi chúng tôi nhận được chúng trong một vòng lặp.
  • Tùy chọn để kiểm tra nếu một hàng nhất định có nhiều 1:
    • ${#${(M)a:#1}: :#loại bỏ kết hợp và (M)đảo ngược kết quả khớp. Vì vậy, điều này sẽ mở rộng đến số ( ${# }) của 1s trong mảng. Thật không may, bản mở rộng này không chơi tốt với số học cho vòng lặp mà chúng tôi sử dụng ở đây. Nếu có, nó có khả năng lưu một byte.
    • ${${:-1}:*a}: Đây là giao điểm thiết lập giữa đơn 1và tập hợp a. Điều này sẽ mở rộng thành đơn 1nếu nó được tìm thấy trong mảng. Sử dụng tùy chọn này, chúng tôi lưu một ký tự ở đây, nhưng mất 1 tổng thể phải tắt thêm 1s ở hàng và cột cuối cùng cho đến khi kết thúc.
f(){ # f [element] [modular base], puts powers up to n-2 into array $a
    a=()
    for i ({1..$[$2-2]})
        a+=($[$1**i%$2])
}
a=(1)                     # put 1 in a to force first loop iteration
for ((;${${:-1}:*a};))    # test for 1 in array $a
    f $[++x] $1           # increment x, iterate through all elements mod $1
for y ($a 1){             # for all elements in the [last array, 1]
    f $y $1               # put that row in $a
    <<<$a\ 1              # print out $a with 1 appended (space-delimited string)
}

1

Perl 6 , 65 57 byte

{.[|.first(*.Set+2>$_)]}o{.&{@=(($++X**1..^$_)X%$_)xx$_}}

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

Có lẽ có một số cách để tự xuất hình vuông, nhưng điều này thực hiện cùng một quy trình được nêu trong câu hỏi, sắp xếp các danh sách theo vị trí của chúng trong danh sách đầu tiên chỉ là hoán vị từ 1 đến đầu vào-1. Trả về như một danh sách các danh sách.

BTW, có rất nhiều trò đùa xung quanh, cố gắng khắc phục một số hạn chế gây phiền nhiễu của Perl 6 liên quan đến chuỗi so với mảng và các biến ẩn danh.

Giải trình:

                               $++               xx$_    # Map 0 to i-1 to
                              (   X**1..^$_)             # n, n^2, n^3... n^(i-1)
                             (              X%$_)        # All modulo i
{                      }o{.&{                        }}  # Pass to the next function
 .[                   ]    # Index into that list of lists
   |.first(          )     # The list of the first list that
           *.Set+2>$_        # Has all the elements in the range 1 to i-1


1

05AB1E , 19 16 byte

LεI<LmI%}ÐΘOÏн<è

-3 byte nhờ @Emigna .

Hãy thử trực tuyến (chân trang là để in đẹp danh sách 2D).

Giải trình:

L          # Create a list in the range [1, (implicit) input]
 ε         # Map each number `y` in the list to:
  I<L      #  Create a list in the range [1, input-1]
     m     #  Get number `y` to the power of each number in this list
      I%   #  Take modulo-input on each number
         # After the map: triplicate this modified matrix
   ΘO      # Get the amount of 1s in each row
     Ï     # And only leave the rows with exactly one 1
      н    # Then only leave the first row which contains a single 1
       <   # Decrease each value by 1 to make it 0-indexed
        è  # And index each into the rows of the modified matrix to create a new matrix
           # (which is output implicitly as result)

1
LεI<LmI%}ÐΘOÏн<ècho 16 byte.
Emigna

@Emigna Cảm ơn! Không nhận ra sẽ là đủ thay vì UΣXyktôi đã có.
Kevin Cruijssen



0

APL (NARS), 29 ký tự, 58 byte

{k←⍵∣⍺*⍳⍵-1⋄⊃{m∣k*⍵}¨⍳¯1+m←⍵}

kiểm tra:

  f←{k←⍵∣⍺*⍳⍵-1⋄⊃{m∣k*⍵}¨⍳¯1+m←⍵}
  3 f 7
3 2 6 4 5 1
2 4 1 2 4 1
6 1 6 1 6 1
4 2 1 4 2 1
5 4 6 2 3 1
1 1 1 1 1 1
  5 f 7
5 4 6 2 3 1
4 2 1 4 2 1
6 1 6 1 6 1
2 4 1 2 4 1
3 2 6 4 5 1
1 1 1 1 1 1 
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.