마법의 모듈로 사각형


11

나는 수 이론의 큰 팬입니다. 숫자 이론에서 가장 중요한 것은 모듈 식 산술입니다. 정의는 이고 m \ mid ab 인 경우에만 해당됩니다 . 재미있는 것은 힘을 키우는 것입니다. 특히 모듈러스가 소수 일 때. 특히, am 이 상대적으로 소수 인 경우 ( 1 이외의 공통 요소를 공유하지 않음 ) a ^ e \ equiv 1 \ mod m 과 같은 숫자 e 가 존재 함 이 입증되었습니다 .abmodmmabam1eae1modm

나는 예제로 운동이 무엇인지 설명 할 것이다. 계수 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

각 행은 해당 행의 첫 번째 숫자의 거듭 제곱 목록입니다. 첫 번째 행은 3,32,33,,36 이며 이는 3,2,6,4,5,1 와 같습니다. , 1 모듈로 7 . 위 사각형의 두 번째 행은 2 의 거듭 제곱입니다 . 마지막 행까지는 1 거듭 제곱입니다 .

이것은 다음과 같은 이유로 마법의 모듈로 제곱입니다.

  • 사각형은 대칭입니다. 즉, i 번째 열은 i 번째 행 과 동일 합니다.
  • 1 에서 m11 까지의 모든 값이 한 번 이상 나타납니다.

다음은 거듭 제곱으로 시작하는 대한 다른 유효한 출력입니다 .m=75

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

도전

프라임 p출력에 마법의 모듈로 정사각형, 즉 측면 길이가있는 정사각형 을 제공하는 함수 또는 프로그램을 작성하여 p-1각 행이 행의 첫 번째 요소의 연속 검정력 목록이고 열에 대해서도 동일하게하십시오. 모든 숫자 사이 0p발생해야하며, 사각는 해당 범위의 숫자를 포함 할 수 있습니다.

입력은 숫자 또는 문자열이며 출력은 ASCII, 행렬, 배열 배열 (합리적인 형식) 일 수 있습니다.

이것은 코드 골프이므로 가장 짧은 코드가 승리합니다.


관련 OEIS 시퀀스 : A001918 (왼쪽 상단 모서리에 유효한 최소값).
Arnauld

2
AA1,1pAi,j=A1,1ijmodp

2
@PeterTaylor 사실, 그것이 의미하는 바이지만, 첫째는 탐사 재미의 일부를 망치고 둘째는 원시 뿌리와 모듈 식 산술에 대한 지식에 의존합니다. 나는이 질문이 그것보다 더 많은 청중들에게 대답하기를 원했기 때문에 더 쉬운 용어로 의미하는 바를 설명하려고 노력했다.
vrugtehagel

답변:


5

젤리 , 13 10 바이트

Nick Kennedy에게 -3 감사합니다

체감 온도 반복되는 코드를 해야한다는 골프-수 있습니다,하지만 난 관리하지 않은 거라고 를 ...

*€Ṗ%µQƑƇḢị

온라인으로 사용해보십시오! (바닥 글로 예쁜 형식을 그리드로 표시)

어떻게?

*€Ṗ%µ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


아하, 이제 느리게 느낀다; p 감사합니다!
Jonathan Allan

3

, 36 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 참고 : 후행 공간. 설명:

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

만들기 p-1p-1의 전력의 배열 1..p-1인덱스에 1..p-1(모듈 p).

E⊟Φη⁼¹№ι¹

정확히 하나가있는 행 중 하나에 맵핑하십시오 1.

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

선택한 행이 지정한 순서대로 행을 다시 정렬하고 출력을 형식화하십시오.




2

자바 스크립트 (ES7),  91  86 바이트

이 버전은 모듈로를 적용하기 전에 전력을 계산하려고 시도하며 정밀도 손실로 인해 11 실패합니다 . 그렇지 않으면 아래의 주석 버전과 동일한 논리를 사용하고 있습니다.

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

온라인으로 사용해보십시오!


자바 스크립트 (ES6),  92  87 바이트

이 버전은 모듈 식 지수를 사용하여 더 많은 입력 값을 지원합니다.

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)

온라인으로 사용해보십시오!

어떻게?

첫 번째 행 찾기

1케이< 주어지면 도우미 함수 를 사용 케이()=케이모드1< 대한 k k ( n ) = k n mod 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()

케이케이()=11

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

이것은 다음과 같은 sort()이유로 사전 식 순서로 작동합니다 .

  • 1
  • 11

예:

=17

  • 케이=1
    • 1=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
    • 로 정렬[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
  • k=2
    • a2=[2,4,8,16,15,13,9,1,2,4,8,16,15,13,9,1]
    • 로 정렬 됨[1,1,13,13,15,15,16,16,2,2,4,4,8,8,9,9]
  • k=3
    • a3=[3,9,10,13,5,15,11,16,14,8,7,4,12,2,6,1]
    • 로 정렬 됨[1,10,11,12,13,14,15,16,2,,4,5,6,7,8,9]

매트릭스 구축

케이(케이)(케이)

이 부분은 간단히 다음과 같이 쓸 수 있습니다.

g(k).map(g)

.indexOf(1)>p-33 바이트 이상을 저장합니다 .every.
Neil

감사합니다. 하지만 잘 자고 나면 더 짧은 길을 찾았습니다. :)
Arnauld

2

Zsh , 117 90 바이트

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

온라인으로 사용해보십시오! 온라인으로 사용해보십시오!

하나님이 내 영혼에 자비를 주시기를 여기에 정리 된 나쁜 습관이 많이 있습니다. 적어도 가장 큰 범죄자를 설명하겠습니다.

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

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

마지막으로, $c프로그램의 나머지 부분에서 배열 요소는로 평가됩니다 eval set -- .....

마지막으로 ${#${(u)@}}위치 매개 변수에서 고유 요소를 계산합니다 (예 : 사이클이 1있습니까 / 있습니까?)

아래의 117 바이트 답변과 관련된 설명입니다.


우리가 극복해야 할 과제 :

  • 다차원 또는 중첩 배열이 없습니다. 대신 우리는 문자열을 루프에 넣을 때 문자열을 인쇄합니다.
  • 주어진 행에 여러 개의 1이있는 경우 테스트를위한 옵션 :
    • ${#${(M)a:#1}: :#일치를 제거하고 일치를 (M)되돌립니다. 따라서 이것은 배열에서의 수 ( ${# })로 확장됩니다 1. 불행히도이 확장은 우리가 여기서 사용하는 산술 for 루프와 잘 어울리지 않습니다. 그렇다면 바이트를 절약 할 수 있습니다.
    • ${${:-1}:*a}: 이것은 싱글 톤 1과 세트 사이의 설정된 교차점 입니다 a. 1배열에서 발견되면 단일로 확장됩니다 . 이 옵션을 사용하면 여기에 한 문자를 저장하지만 1마지막 행과 열에 s를 끝까지 추가하지 않아도 전체적으로 1을 잃습니다 .
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

펄 6 , 65 57 바이트

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

온라인으로 사용해보십시오!

아마도 정사각형 자체를 출력하는 방법이있을 수 있지만 이것은 질문에 설명 된 것과 동일한 프로세스를 수행하여 첫 번째 목록의 위치를 ​​1에서 입력 1로 순열하는 목록으로 정렬합니다. 목록의 목록으로 반환합니다.

BTW, 많은 대담한 노력이있어서 시퀀스 대 배열 및 익명 변수와 관련된 Perl 6의 성가신 한계를 극복하려고합니다.

설명:

                               $++               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 바이트

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

@Emigna 덕분에 -3 바이트 .

온라인으로 시도하십시오 (바닥 글은 2D 목록을 예쁘게 인쇄하는 것입니다).

설명:

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Ïн<è 16 바이트
Emigna

@Emigna 감사합니다! 내가 가진 대신에 충분했을 것임을 몰랐다 UΣXyk.
케빈 크루이 센



0

APL (NARS), 29 자, 58 바이트

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

테스트:

  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 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.