합동 수


21

정의 :

  • 삼각형은 고려 직각 삼각형 내부 각도 중 하나가 정확히 90 ° 인 경우.
  • 숫자는 고려 합리적 이 정수의 비율로 표현, 즉, 될 수 있다면 p/q, 어디에 둘 pq정수입니다.
  • 세 변이 모두 합리적인 영역의 오른쪽 삼각형이있는 경우 숫자 n일치하는 숫자n 입니다.
  • OEIS A003273 입니다.

도전

이것은 입니다. 입력 번호가 주어지면 일치하는 숫자 인 x경우 고유하고 일관된 값을 출력하고 x일치하는 숫자 x가 아닌 경우 별도의 고유하고 일관된 값을 출력하십시오 . 출력 값이 반드시 귀하의 언어에서 진실 / 거짓 일 필요는 없습니다.

특별 규칙

이 도전의 목적으로, 당신은 Birch와 Swinnerton-Dyer 추측 이 참 이라고 가정 할 수 있습니다 . 또는 Birch and Swinnerton-Dyer 추측을 증명할 수 있다면 $ 1,000,000 Millennium 상을 받으십시오. ;-)

( True동일한 숫자 등을 위해 사용 False).

5 True
6 True
108 False

규칙 및 설명

  • 입력 및 출력은 편리한 방법 으로 제공 할 수 있습니다 .
  • 결과를 STDOUT에 인쇄하거나 함수 결과로 리턴 할 수 있습니다. 출력물에 어떤 값을 사용할 수 있는지 제출물에 명시하십시오.
  • 전체 프로그램 또는 기능이 허용됩니다.
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

3
입력이 양의 정수입니까?
Lynn

필자의 초기 접근법은 피타고라스 트리플에서 다리의 곱의 절반이 될 때까지 임의의 제곱 수를 입력에 곱하는 것이었지만, 일치하지 않는 입력에 대해서는 실제로 종료하기가 약간 어려울 수 있음을 깨달았습니다.
관련이없는 문자열

@ Xi'an 좋아, 그러나 도전은 독립적이어야한다.
Lynn

@Lynn 예, 입력은 양의 정수입니다.
AdmBorkBork

답변:


8

R, 179 173 142 141 137 135 134 바이트

Tunnell 's Theorem 에 기반한 동일한 인수를 사용하여 0if n가 적합하지 않은 경우 와 1그렇지 않은 경우를 반환합니다 . ( 제곱없는 정수 에만 적용 되는 조건 의 제약 조건을 찾는 데 시간이 오래 걸렸습니다 .)

function(n){b=(-n:n)^2
for(i in b^!!b)n=n/i^(!n%%i)
P=1+n%%2
o=outer
!sum(!o(y<-o(8/P*b,2*b,"+")/P-n,z<-16/P*b,"+"),-2*!o(y,4*z,"+"))}

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

ArnaudGiuseppe의 개선 사항 (최종 코드는 대부분 Guiseppe 's!)- Robin 덕분에 -3

구문 분석 :

for(i in b[b>0])n=n/i^(!n%%i) #eliminates all square divisors of n
P=2^(n%%2)                    #n odd (2) or even (1)
o=outer                       #saves 3 bytes 
o(8/P*b,2*b,"+")/P-n          #all sums of (8/P)x^2+(2/P)*y^2-n
o(...,16/P*b,"+")             #all sums of above and (16/P)*z^2
o(...,4*z,"+"))               #all sums of above and (64/P)*z^2
!o(...,4*z,"+"))              #all sums of above equal to zero
!sum(!...,2*!...)             #are zeroes twice one another (Tunnell)

함께 Tunnell 정리는 그 N 알리는 합동 경우에만, 정수 솔루션의 수 2x² + y² + 8z² = n은 두 배 2x² 정수 솔루션의 개수 + y² + 32z² = N, n은 홀수 번호인지 n이 짝수이면 8x² + y² + 16z² = n에 대한 정수 솔루션의 수는 8x² + y² + 64z² = n에 대한 정수 솔루션 수의 두 배입니다.


1
PPCG에 오신 것을 환영합니다! 목표는 코드를 최대한 짧게 만드는 것입니다. 아마도 당신이 볼 수있는 골프에 대한 팁 또는 이러한 R-특정 팁 .
주세페

1
공백이 많이 있으며 온라인 사용해보기 링크를 포함시키는 것이 좋습니다 . 코드 확인을 돕기 위해 :-)
Giuseppe

1
에 연락 주시기 R 골퍼 채팅 당신이 원하신다면 너무; 당신은 @[username]로빈 라이더에 의해 코드 골프에 끌렸다 고 생각하고 있습니다 ... 를 사용하여 알릴 수 있습니까 ??
주세페

1
142 바이트 -익명 함수는 완벽하게 잘 설명되어 있습니다. 설명 할 수있는 다른 골프도 만들었습니다.
Giuseppe

1
좋은! 당신이 사용하는 이유가 -n:n있습니까? 터널의 정리를 읽지는 않았지만 n:0-1 바이트에서도 잘 작동 하는 것 같습니다 ... 또한 팁 : TIO 상단의 "링크"버튼을 누르면 멋진 결과를 얻을 수 있습니다. PPCG로 복사하여 붙여 넣기위한 형식 :-) 편집 : n:0작동하지 않는 경우 가 있습니다.
주세페

3

녹-282 바이트

fn is(mut n:i64)->bool{let(mut v,p)=(vec![0;4],n as usize%2);while let Some(l)=(2..n).filter(|i|n%(i*i)==0).nth(0){n/=l*l;}for x in -n..=n{for y in -n..=n{for z in -n..=n{for i in 0..2{if n-6*x*x*(n+1)%2==2*x*x+(2-n%2)*(y*y+(24*i as i64+8)*z*z){v[2*p+i]+=1};}}}}v[2*p]==2*v[2*p+1]}
  • 내가 실제로 이해하지 못하지만 어쨌든 효과가있는 Jerrold B. Tunnell 의 정리를 사용하십시오 .
  • Tunnell의 정리 아래의 논문에서 square-frees에 대해서만 설명되었으므로 n을 모든 제곱 인수로 나누면 '제곱없는'이됩니다.
    • 모든 합동 수에 사각형을 곱하면 더 큰 합동 수가 생성되고 그 반대도 가능하기 때문에 이것이 효과가 있다고 생각합니다. 더 작은 수를 테스트함으로써 더 큰 수를 검증 할 수 있습니다.이 경우에는 n입니다. (제거 된 모든 사각형을 곱하여 하나의 큰 사각형을 만들 수 있음).
  • if n is odd, test if n = 2x2+y2+32z2 and/or 2x2+y2+8z2
    if n is even, test if n = 8x2+2y2+64z2 and/or 8x2+2y2+16z2
    • 코드 자체에서 짝수 / 홀수에 대해 모듈로를 사용하여 루프 내에서 네 개의 방정식이 하나로 스무 싱되었습니다.
  • 어떤 방정식이 n과 일치하는지 집계 계산
  • 루핑 후, Tallies의 비율을 테스트하십시오 (Tunnell 당)

참조 :

@Level River St 덕분에 짝수 / 홀수 수정


1
오, 글쎄, 내가이 일을했을 때 나는 잘못된 C ++ 답변 만 보았습니다 ...
밝은 돈

감사 레벨 강 세인트는
밝은 돈

3

C ++ (gcc) , 251234 바이트

내 부분에 바보 같은 오타를 지적 한 @arnauld에게 감사드립니다.

@ceilingcat 덕분에 -17 바이트.

#import<cmath>
int a(int n){int s=sqrt(n),c,x=-s,y,z,i=1,X;for(;++i<n;)for(;n%(i*i)<1;n/=i*i);for(;x++<s;)for(y=-s;y++<s;)for(z=-s;z++<s;c+=n&1?2*(n==X+24*z*z)-(n==X):2*(n==4*x*x+2*X+48*z*z)-(n/2==2*x*x+X))X=2*x*x+y*y+8*z*z;return!c;}

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

n일치하는 경우 1을 , 그렇지 않으면 0을 반환합니다.

qs2q 또한 합리적입니다 (알고리즘은 일부 제곱 포함 숫자에서 깨지는 것 같습니다.


1
@ Arnauld : 아, 그건 내 부분의 오타였습니다. 결정된.
닐 A.

1

자바 스크립트 (ES7), 165 바이트

@NeilA.의 답변 과 마찬가지로 이것은 Tunnell의 정리를 기반으로 하므로 Birch 및 Swinnerton-Dyer 추측이 사실이라고 가정합니다.

부울 값을 반환합니다.

n=>(r=(g=i=>i<n?g(i+!(n%i**2?0:n/=i*i)):n**.5|0)(s=2),g=(C,k=r)=>k+r&&g(C,k-1,C(k*k)))(x=>g(y=>g(z=>s+=2*(n==(X=(n&1?2:8)*x+(o=2-n%2)*y)+o*32*z)-(n==X+o*8*z))))|s==2

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

방법?

nnr=ns2

r = (                // we will eventually save isqrt(n) into r
  g = i =>           // g = recursive function taking an integer i
    i < n ?          //   if i is less than n:
      g(i + !(       //     do a recursive call with either i or i + 1
        n % i**2 ?   //     if n is not divisible by i²:
          0          //       yield 0 and therefore increment i
        :            //     else:
          n /= i * i //       divide n by i² and leave i unchanged
      ))             //     end of recursive call
    :                //   else:
      n ** .5 | 0    //     stop recursion and return isqrt(n)
  )(s = 2)           // initial call to g with i = s = 2

gCk2r<kr

  g = (C, k = r) =>  // C = callback function, k = counter initialized to r
    k + r &&         //   if k is not equal to -r:
    g(               //     do a recursive call:
      C,             //       pass the callback function unchanged
      k - 1,         //       decrement k
      C(k * k)       //       invoke the callback function with k²
    )                //     end of recursive call

g(x,y,z)[r+1,r]3s2An=Bnn2Cn=Dnn

An=#{(x,y,z)[r+1,r]3n=2x2+y2+32z2}Bn=#{(x,y,z)[r+1,r]3n=2x2+y2+8z2}Cn=#{(x,y,z)[r+1,r]3n=8x2+2y2+64z2}Dn=#{(x,y,z)[r+1,r]3n=8x2+2y2+16z2}

g(x =>                            // for each x:      \    NB:
  g(y =>                          //   for each y:     >-- all these values are
    g(z =>                        //     for each z:  /    already squared by g
      s +=                        //       add to s:
        2 * (                     //         +2 if:
          n == (                  //           n is equal to either
            X =                   //           An if n is odd (o = 1)
            (n & 1 ? 2 : 8) * x + //           or Cn if n is even (o = 2)
            (o = 2 - n % 2) * y   //
          ) + o * 32 * z          //
        ) - (                     //         -1 if:
          n == X + o * 8 * z      //           n is equal to either
        )                         //           Bn if n is odd
    )                             //           or Dn if n is even
  )                               //
)                                 // if s in unchanged, then n is (assumed to be) congruent

1

루비 , 126 바이트

->n{[8,32].product(*[(-n..-t=1).map{|i|i*=i;n%i<1&&n/=i;i}*2+[0]]*3).map{|j|d=2-n%2
k,x,y,z=j
2*d*x+y+k*z==n/d&&t+=k-16}
t==1}

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

추가 사본을 만드는 데 t=1사용 q하는 대신 사각형 목록 을 초기화 하고 삼중 항으로 확장 할 장소를 찾았습니다 .

루비 , 129 바이트

->n{t=0
[8,32].product(q=(-n..-1).map{|i|i*=i;n%i<1&&n/=i;i}*2+[0],q,q).map{|j|d=2-n%2
k,x,y,z=j
2*d*x+y+k*z==n/d&&t+=k-16}
t==0}

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

다른 답변과 마찬가지로 Tunnell의 정리를 사용합니다. 다음과 같은 단일 방정식을 사용합니다.

2*d*x^2 + y^2 + k*z^2 == n/d  where d=2 for even n and d=1 for odd n

우리는 사례를 확인 k=8하고 k=32그리고 많은 솔루션으로 두 번이 있는지 확인 k=8보다 k=32. 솔루션을 찾을 때마다 추가 k-16하면 t됩니다. 이 경우 +16 k=32또는 경우 -8입니다 k=8. t함수의 끝에서 초기 값과 같은 경우 전체적으로 숫자가 일치 합니다.

테스트 방정식에 대한 모든 솔루션을 찾아야합니다. +/- 사이에서 많은 답변을 테스트하는 것을 봅니다 sqrt n. 코드를 더 짧게 만들면 이러한 한계를 넘어서도 테스트해도 괜찮지 만 방정식의 왼쪽이를 초과하기 때문에 해를 구할 수 없습니다 n. 처음에 내가 놓친 것은 부정적인 것과 긍정적 인 x,y,z것이 따로 고려 된다는 것 입니다. 따라서 -3,0,3세 제곱을 산출 9,0,9하고 모든 솔루션을 별도로 계산해야합니다 (0은 한 번 9계산하고 두 번 계산해야 함).

Ungolfed 코드

->n{t=0                              #counter for solutions

  q=(-n..-1).map{|i|i*=i;n%i<1&&n/=i #make n square free by dividing by -n^2 to -1^2 as necessary 
  i}*2+[0]                           #return an array of squares, duplicate for 1^2 to n^2, and add the case 0 

  [8,32].product(q,q,q).map{|j|      #make a cartesian product of all possible values for k,x,y,z and iterate
    d=2-n%2                          #d=1 for odd n, 2 for even n
    k,x,y,z=j                        #unpack j. k=8,32. x,y,z are the squared values from q.
    2*d*x+y+k*z==n/d&&t+=k-16}       #test if the current values of k,x,y,z are a valid solution. If so, adjust t by k-16 as explained above.
t==0}                                #return true if t is the same as its initial value. otherwise false.

긍정적이고 부정적인 해결책에 관해서는 여기에서도 마찬가지입니다.
시안
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.