유사 프라임 골프!


9

소개 / 배경

A의 최근 논의 에서 크립토 채팅 I가와 / 도움을 논의하기 위해 도전했다 페르마 소수도 테스트 와 카 마이 클 번호. 이 테스트는 a^(p-1) mod p==1항상 소수 p에 대해서는 적용되지만 항상 복합 소수 에는 적용되지 않는 전제를 기반으로합니다 . 이제 카 마이클 숫자는 본질적으로 Fermat의 테스트 최악의 적입니다 : 를 얻기 위해 함께 프라임하지 않기 위해 선택 해야하는 숫자입니다 . 이제 공동 프라임이 아닌 경우 본질적으로 다음과 같은 사소한 요소를 발견했습니다.apa^(p-1) mod p!=1ap우리 모두 알고 있듯이 팩토링은 매우 어려울 수 있습니다. 특히 모든 요인이 충분히 큰 경우. 이제 Fermat 테스트가 실제로 자주 사용되지 않는 이유를 알 수 있습니다 (알고리즘이 더 나은 알고리즘이 있음). 공격자 (즉, 숫자를 고려).

이제 우리는 왜이 숫자들이 다소 매혹적인 알게 되었으므로 가능한 한 가장 짧은 방법으로 숫자를 생성 할 것이므로, 필요한 경우 생성 코드를 외울 수 있습니다!

Carmichael 번호OEIS 에서 A002997이라고도합니다 .
거기입니다 관련 문제는 이미하지만, 크기 반대로 그들이 속도에 최적화되어 있기 때문에 거기에서 항목은 여기에 경쟁력이있다. 반대 방향에서도 같은 주장이 나옵니다. 여기서 입장하면 크기에 유리한 속도와 균형을 맞출 수 있습니다.

사양

입력

이것은 표준입니다 n입력 값 으로 양수 또는 음수가 아닌 정수 를 사용합니다. n원하는대로 0 또는 1 인덱싱 될 수 있습니다 (표시하십시오).

산출

원하는대로 출력은 n-carcar 번호 또는 첫 번째 ncarmichael 번호입니다 (표시하십시오).

사양

정수는 x카 마이클 수있는 경우이며 경우에만 x복합이며 모든 정수에 대한 ygcd(x,y)=1, 그 보유 y^(x-1) mod x==1.

누가 이겼어?

이것은 바이트 단위로 가장 짧은 코드가 승리합니다!
표준 IO 및 허점 규칙이 적용됩니다.

테스트 사례

처음 몇 개의 카 마이클 숫자는 다음과 같습니다.

 561,1105,1729,2465,2821,6601,8911,10585,15841,
 29341,41041,46657,52633,62745,63973,75361,101101,
 115921,126217,162401,172081,188461,252601,278545,
 294409,314821,334153,340561,399001,410041,449065,
 488881,512461

답변:



6

파이썬 2 , 92 바이트

f=lambda j,n=1:j and f(j-([(k/n)**~-n%n for k in range(n*n)if k/n*k%n==1]<[1]*~-n),n+1)or~-n

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

1-색인 및 당밀처럼 느립니다.

목록 이해에서, 나는 모든 정수 coprime ton (n 's totatives ) 를 생성하기 위해 Dennis의 방법을 사용하고 모든 정수를 계산 x**~-n%n합니다. 이 목록을 호출합시다 L.

카 마이클 (Carmichael) 번호를 감지하기 위해이 목록을 사전 식 으로 구성한 목록과 비교 n-1합니다. 왜 이것이 작동합니까?

각 소자 L양수된다 : (k/n)에 서로 소이고 n그래서, (k/n)**~-n그래서,도이다 (k/n)**~-n%n > 0. 따라서, 그것의 가능한 가능한 값 L은 사 전적으로 1보다 작은 값으로 [1]*(n-1)구성된 값보다 작습니다 n-1 . ( L포함 할 수 없습니다 이상 n-1같은 값 n이상 가질 수 없습니다 n-1totatives 비교는 같은! [1,1,1,1,3] < [1,1,1,1]밖으로 수 있습니다.)

n-1항목 이 적은지 확인 L하면 n복합적인지 확인합니다. ( n-1Totatives 를 갖는 것은 primality와 동등한 조건입니다.) 그리고 Carmichael 수가되는 조건은 정확히 모든 요소가 L같습니다 1. 그래서이 사전 비교는 L우리가 관심있는 것을 정확하게 감지합니다 .

Xcoder는 재귀 람다 형식으로 전환하여 바이트를 저장했습니다 j. Carmichael 숫자를 칠 때마다 카운트 다운하고 n우리가 재귀 할 때마다 카운트 업합니다. 따라서 한 번 j0에 n-1도달하면 original_value_of_j'카 마이클 수' 와 같습니다 .


5

젤리 ,  12  11 바이트

마일Mr. Xcoder 덕분에 -1 바이트 (Carmichael 기능 원자 사용 및 골프)

%Æc’=ÆP
⁹Ç#

n첫 번째 n카 마이클 번호 목록을 가져 와서 반환하는 모나드 링크 .

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

어떻게?

Carmichael 함수가 내장되어 있다는 점을 제외하고는 이전 (아래)과 매우 비슷합니다.이 함수는 가장 작은 전력을 생성하여 해당 전력으로 발생하는 입력이 해당 정수에 대해 모든 정수의 전력을 소비하는 하나의 모듈로와 합치합니다. 따라서 우리는 더 적은 바이트로 오탐 (프라임)을 제외하고 더 빠른 코드를 가질 수 있습니다!

%Æc’⁼ÆP - isCarmichael: number, n (any integer)
 Æc     - Carmicael function of n
%       - n modulo that
   ’    - decremented (0 for Carmichael numbers and primes)
     ÆP - is n prime? (1 for primes 0 otherwise)
    ⁼   - equal?

⁹Ç# - Main link: number, n
  # - count up finding the first n values satisfying:
 Ç  - ...condition: call the last link as a monad
⁹   - ...starting with a value of: literal 256

이전 12 바이트 :

Ṗ*%⁼Ṗ_ÆP
⁹Ç#

온라인으로 사용해보십시오! (예, 시간이 초과되었습니다 n=3).

어떻게?

, c는 합성 인 경우 Carmichael 수이며 x,으로 올린 정수 cxmodulo 와 일치 하는 것이 사실입니다 c.

우리는 이것 자체 를 긍정적으로 확인 x하기 x=c만하면됩니다.

또한 확인시 x=cx거듭 제곱이 모듈로 와 x일치 하는지 여부 가 사실이므로 확인하지 않아도됩니다 (이는 코드를 더 짧게 만듭니다).xx

Ṗ*%⁼Ṗ_ÆP - Link 1, isCarmichaelNumber: integer c (greater than 1)
Ṗ        - pop c (uses the implicit range(c)) = [1, 2, 3, ..., c-1]
 *       - raise to the power of c (vectorises) = [1^c, 2^c, 3^c, ..., (c-1)^c]
  %      - modulo by c (vectorises) = [1^c%c, 2^c%c, 3^c%c, ..., (c-1)^c%c]
    Ṗ    - pop c = [1, 2, 3, ..., c-1]
   ⁼     - equal? (non-vectorising) = 1 if so, 0 if not
      ÆP - isPrime?(c) = 1 if so, 0 if not
     _   - subtract = 1 if Carmichael 0 if not
         -     (Note the caveat that c must be an integer greater than 1, this is because
         -      popping 1 yields [] thus the equality check will hold; same for 0,-1,...)

⁹Ç# - Main link: number, n
  # - count up finding the first n values satisfying:
 Ç  - ...condition: call the last link as a monad
⁹   - ...starting with a value of: literal 256

또한 12 바이트 이지만 Carmichael 원자를 사용하여 1 분 안에 처음 33 개를 계산합니다.
마일

내장 Carmichael 기능을 사용하여 11 바이트 .
Mr. Xcoder

@ Mr.Xcoder 나는 별도로 게시 된 마일을 제안 한 다음 당신의 의견을보고 삭제했습니다. dv는 누군가 가이 마일이 아닌 마일이 언급 한 것과 너무 비슷하다고 생각하기 때문일 수 있습니다. 그런 종류의 일을 여러 번했습니다). 원하는 경우 11을 게시하지만 귀하 또는 마일은 약간의 신용을 가져야한다고 생각합니다.
Jonathan Allan

@ 마일도 ... ^
Jonathan Allan

@JonathanAllan 직접 게시하십시오. 마일리지와 기여도를 언급하고 마일리지도 생각하지 않습니다 :-) (BTW 답변을 게시하기 전에 마일의 코멘트를 보지 못했습니다 :-/)
Mr. Xcoder

2

ECMAScript 정규식, 86 89 바이트

경고 : 단항 정규식 마술이 당신을 망치고 싶지 않다면 이것을 읽으십시오. 이 마법을 스스로 파악하는 데 총력을 기울이고 싶다면 ECMAScript 정규식에서 몇 가지 문제를 해결하여 시작하는 것이 좋습니다. 이전 게시물 에서는 하나씩 스포일러 태그가 지정된 권장 문제 목록을 확인하십시오 .

^(?!(x(x+))(?!\2*$)\1*(?=\1$)(?!(xx+)\3+$))((?=(xx+?)\5*$)(?=(x+)(\6+$))\7(?!\5*$)){2,}x$

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

# Match Carmichael numbers in the domain ^x*$ using Korselt's criterion
# N = input number (initial value of tail)
^
(?!
    # Iterate through factors \1, with \2 = \1-1, for which \2 does not divide into N-1
    (x(x+))
    (?!\2*$)           # Assert N-1 is not divisible by \2
    \1*(?=\1$)         # Assert N is divisible by \1; tail = \1
    # If the factor \1, which already passed the aboved tests, is prime, then fail the
    # outside negative lookahead, because N is not a Carmichael number.
    (?!(xx+)\3+$)
)
# Assert that N has at least 2 unique prime factors, and that all of its prime factors
# are of exactly single multiplicity (i.e. that N is square-free).
(
    (?=(xx+?)\5*$)     # \5 = smallest prime factor of tail
    (?=(x+)(\6+$))     # \6 = tail / \5 (implicitly); \7 = tool to make tail = \6
    \7                 # tail = \6
    (?!\5*$)           # Assert that tail is no longer divisible by \5, i.e. that that
                       # prime factor was of exactly single multiplicity.
){2,}
x$

이 정규 표현식의 주요 마술은 N의 모든 주요 요소가 정확히 하나의 다중성임을 주장하는 부분입니다. 내에서 사용 된 것과 동일한 트릭 길이가 일치 문자열 네 번째 힘이다 하고 매끄러운 번호 찾기 가장 작은 소인수에 의해 암시 적 분열을 반복했다 : 정규 표현식에 있습니다.

N에 완전 제곱 요소가 없는지 (즉, N에 제곱이 없는지) 직접 테스트 할 수도 있습니다. 이것은 숫자가 완벽한 제곱인지 테스트하기 위해 풍부한 숫자 정규 표현식 게시물 의 단락에 간략하게 설명 된 곱셈 알고리즘의 변형을 사용합니다 . 이것은이다 스포일러 . 따라서 고급 단항 정규식 마법을 원하지 않는다면 더 이상 읽지 마십시오 . 이 마법을 스스로 알아내는 데 총력을 기울이고 싶다면 이 이전 게시물의 스포일러 태그가 지정된 권장 문제 목록에서 몇 가지 문제를 해결 하고 수학 통찰력을 독립적으로 생각해 보는 것이 좋습니다 .

그러나이 문제에 해당 알고리즘을 사용한다고해서 아무런 이점이 없습니다. 크기가 97 바이트 인 정규식이 느려집니다. 소수 다중성 검정 (하나의 루프에서 최소 2 개의 소수 요인이 있고 각각 단일 다중성임을 주장함)이 없으면, N이 합성임을 별도로 주장해야합니다.

^(?!(x(x+))(?!\2*$)\1*(?=\1$)(?!(xx+)\3+$)|((xx+)\5*(?=\5$))?(x(x*))(?=(\6*)\7+$)\6*$\8)(xx+)\9+$

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


 ^
 (?!
     # Iterate through factors \1, with \2 = \1-1, for which \2 does not divide into N-1
     (x(x+))
     (?!\2*$)           # Assert N-1 is not divisible by \2
     \1*(?=\1$)         # Assert N is divisible by \1; tail = \1
     # If the factor \1, which already passed the aboved tests, is prime, then fail the
     # outside negative lookahead, because N is not a Carmichael number.
     (?!(xx+)\3+$)
 |
 # Assert that N is square-free, i.e. has no divisor >1 that is a perfect square.
     ((xx+)\5*(?=\5$))?  # cycle tail through all of the divisors of N, including N itself
     # Match iff tail is a perfect square
     (x(x*))             # \6 = potential square root; \7 = \6 - 1
     (?=
         (\6*)\7+$       # iff \6 * \6 == our number, then the first match here must result in \8 == 0
     )
     \6*$\8              # test for divisibility by \6 and for \8 == 0 simultaneously
 )
 (xx+)\9+$               # Assert that N is composite
 


2
(엄밀하게 말하면, 이것은 decision-problem대답이지만, 도전은 sequence도전입니다.) 아마도 더 강력한 정규식 변형에서 사용 가능한 제곱 제수에 대한 더 직접적인 테스트가 있습니까?
Neil

@Neil 당신이 옳습니다, 나는 제수를 직접 테스트하여 골프를 밟을 수 있습니다. ECMA에서는 추가 기능이 필요하지 않습니다. 그러나 그렇게하면 훨씬 느려질 것입니다 (스포일러 태그 아래에 숨기고 싶습니다). 두 버전을 모두 포함하고 싶습니다.
Deadcode

예, 이미 작성한 정규식에 대한 질문을 찾는 것은 매우 성가 시며 올바른 유형의 도전은 아닙니다. 답변을 삭제해야합니까?
Deadcode

@Neil 여기 있습니다. 나는 당신의 아이디어를 사용하여 알고리즘을 구현했습니다. 이것이 아마도 내가 직접 추구하지는 않는 이유 일 것입니다. is-composite 테스트가 필요하기 때문에 실제로는 정규 표현식이 길어집니다.
Deadcode

(사이트 규칙 아래에서 답을 삭제해야합니다.) 제 생각은 Retina regexes와 같은 추가 기능을 사용하여 ^(?!(x(x+))(?!\2*$)\1*(?=\1$)(?!(xx+)\3+$)|((^x|xx\5){2,})\4*$)(xx+)\6+$, 또는 72 바이트 미만으로 골프를 치는 것 입니다.
Neil


1

레티 나 , 94 바이트

\d*$
x
"$+"}/^(?!(x(x+))(?!\2*$)\1*(?=\1$)(?!(xx+)\3+$)|((^x|xx\5){2,})\4*$)(xx+)\6+$/^+`$
x
x

온라인으로 사용해보십시오! 1- 색인. 빠르지는 않으므로 n>5TIO에서 시간이 초과됩니다 . 설명:

\d*$
x

현재 값을 증가시킵니다. 첫 번째 패스에서는 n출력 버퍼 에서도 삭제 되지만 $+여전히 액세스 할 수 있습니다.

/^(?!(x(x+))(?!\2*$)\1*(?=\1$)(?!(xx+)\3+$)|((^x|xx\5){2,})\4*$)(xx+)\6+$/

현재 값이 Carmichael 숫자인지 테스트하십시오. 이것은 .NET / Perl / PCRE 정규식을 사용하여 작성할 때 사각형 검출이 더 짧으므로 @Deadcode의 대체 알고리즘을 사용합니다.

^+`

현재 값이 Carmichael 번호가 될 때까지 반복하십시오.

$
x

현재 값을 증가시킵니다.

"$+"}

초기 증분과 루프 n시간 이상을 반복하십시오 .

x

결과를 10 진수로 변환하십시오.


0

하스켈 , 95 바이트

s=filter
c n=s(\x->let l=s((1==).gcd x)f;f=[1..x-1]in l/=f&&all(\y->y^(x-1)`mod`x==1)l)[1..]!!n

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

디고 프드 :

-- function to filter out Carmichael numbers
filterFunction x = 
    let coprimes = filter ((1 ==) . gcd x) lesserNumbers
        lesserNumbers = [1 .. x - 1]
    in
        -- the number x is Carmichael if it is not prime
        lesserNumbers /= coprimes && 
            -- and all of its coprimes satisfy the equation
            all (\y -> y ^ (x - 1) `mod` x == 1) coprimes

-- get n'th Carmichael number (zero-based)
c n = filter filterFunction [1..] !! n
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.