정수의 qvolume


31

음이 아닌 모든 정수를 네 개의 제곱 정수의 합으로 다시 작성할 수 있다는 것은 고대 지식입니다. 예를 들어 숫자 1은 로 표현 될 수 있습니다 . 또는 일반적으로 음이 아닌 정수 에 대해 정수 가 존재 합니다.02+02+02+12na,b,c,d

n=a2+b2+c2+d2

Joseph-Louis Lagrange 는 1700 년대에 이것을 증명 했으므로 종종 Lagrange의 정리 라고 합니다.

이것은 때때로 쿼터니언과 관련하여 논의되는데 , 1800 년대 윌리엄 해밀턴 이 로 여기서 는 실수이고 및 는 곱하지 않는 고유 한 허수 단위입니다. 특히, 쿼터니언 각 성분을 제곱하는 것과 관련하여 설명됩니다. 이 수량은 때때로 norm 또는 squared norm 또는 quadrance라고도 합니다. 라그랑주 정리에 대한 현대의 일부 증거 는 쿼터니언을 사용합니다.

w+엑스나는+와이j+케이
,엑스,와이,나는,j케이
2+엑스2+와이2+2

Rudolf Lipschitz 는 Lipschitz quaternions라고하는 정수 성분 만 가진 쿼터니언을 연구했습니다. 사분면을 사용하면 모든 Lipschitz 쿼터니언이 정수에 친구가 있다고 생각할 수 있습니다. 예를 들어 쿼터니언 은 정수 와 연관된 것으로 생각할 수 있습니다. . 또한 우리가 거꾸로 가면 모든 정수는 Lipschitz 쿼터니언에 친구가 있다고 생각할 수 있습니다.0+0나는+0j+1케이1=02+02+02+12

그러나 Lagrange의 정리에 대한 흥미로운 세부 사항이 있습니다. 요약은 독특하지 않습니다. 각 정수에는 합계를 만들기 위해 합산 할 수있는 4 개의 제곱 집합이 여러 개있을 수 있습니다. 예를 들어, 숫자 1은 음이 아닌 정수를 사용하여 4 가지 방식으로 표현할 수 있습니다 (이 문제에 대해 음이 아닌 정수만 고려하십시오) :

1=02+02+02+12
1=02+02+12+02
1=02+12+02+02
1=12+02+02+02

Summand는 항상 0 또는 1의 제곱이지만 식에서 다른 위치에있을 수 있습니다.

이 과제를 위해, 중복을 제거하기 위해 summands를 가장 낮은 것부터 가장 높은 것까지 "정렬"하여,이 연습에서 1이 4 개의 제곱의 합으로 표현 될 수있는 방법은 한 가지만 고려할 수 있습니다.

1=02+02+02+12

또 다른 예는 숫자 42로, 네 가지 방식으로 표현할 수 있습니다 (다시 음수가 아닌 a, b, c, d 만 고려하고 중복 구성 요소 배열 제거).

42=02+12+42+52
42=12+12+22+62
42=12+2+42+42
42=22+22+2+52

정수를 특정 쿼터니언과 관련된 것으로 표현하는 이러한 서로 다른 방식을 각각 상상한다면 어떻게 될까요? 그런 다음 숫자 42가이 4 개의 쿼터니언과 관련이 있다고 말할 수 있습니다.

0+1나는+4j+5케이
1+1나는+2j+6케이
1+나는+4j+4케이
2+2나는+j+5케이

쿼터니언의 표준 컴퓨터 그래픽 해석을 상상한다면, 여기서 , 및 는 3 차원 유클리드 공간의 벡터 이므로 쿼터니언 의 x , yz 구성 요소 3 차원 데카르트 좌표 인 경우, 우리는이 사고 과정을 통해 각 정수가 공간에서 3 차원 좌표 세트와 연관 ​​될 수 있다고 상상할 수 있습니다. 예를 들어, 숫자 42는 다음 4 개의 ( x , y , z ) 좌표 와 연관됩니다 .나는j케이엑스와이(엑스,와이,)

(1,4,5),(1,2,6),(,4,4),(2,,5)

이것은 점 구름 또는 공간의 점 집합으로 생각할 수 있습니다. 이제 공간의 유한 점 집합에 대한 흥미로운 점 중 하나는 항상 주위에 최소 경계 상자를 그릴 수 있다는 것입니다. 모든 점에 맞을만큼 크지 만 크지 않은 상자입니다. 상자가 엑스,와이, 축 과 정렬 된 일반 상자 라고 생각하면이를 축 정렬 경계 상자 라고합니다 . 경계 상자에는 너비, 길이 및 높이를 결정하고 함께 곱하여 계산할 수있는 볼륨이 있습니다.

그런 다음 쿼터니언에 의해 형성된 점에 대한 경계 상자의 볼륨을 상상할 수 있습니다. 정수 1의 경우이 연습의 기준을 사용하여 사분면이 1, . 이것은 매우 간단한 점 구름이며, 점이 하나뿐이므로 경계 상자의 볼륨은 0입니다. 그러나 정수 42의 경우 4 개의 쿼터니언과 4 개의 점이 있으며 그 주위에 경계 상자를 그릴 수 있습니다. 상자의 최소 점은 이고 최대 값은 이며, 너비, 길이 및 높이가 2, 2 및 2가되어 부피는 8입니다.0+0나는+0j+1케이(1,2,4)(,4,6)

정수 의 경우 qvolume은 과 동일한 사변형을 갖는 쿼터니언으로 형성된 모든 3D 점의 축 정렬 경계 상자의 부피입니다. 여기서 쿼터니언의 구성 요소 는 음수가 입니다.+엑스나는+와이j+케이<=엑스<=와이<=

음이 아닌 단일 정수 주어지면 의 qvolume을 출력 하는 프로그램이나 함수를 만듭니다 .

예 :

input -> output
0 -> 0
1 -> 0
31 -> 4
32 -> 0
42 -> 8
137 -> 96
1729 -> 10032

이것은 코드 골프, 가장 적은 바이트 수입니다.


무엇을 추가해야합니까? 나는 가장 적은 수의 바이트가 이길 것이라는 것을 의미했다
밝게

3
코드 골프 태그를 잊어 버렸습니다. 추가하는 데 도움이되었습니다.
무지의 구현

1
이것은 좋은 도전이지만 조금 덜 장황하다면 IMHO가 더 나을 것입니다. 또한 관련없는 링크에 주의하십시오 (모든 링크가 관련이 없다고 말하지는 않지만 그 중 일부만이 문제에 대한 의미있는 정보를 가져 오는 반면 다른 링크는주의를 산만하게합니다).
Arnauld

1
예, 그러나 왜 3D 공간으로 i, j, k 만 사용하고 4D 공간은 사용하지 않습니까?
tsh

1
쿼터니언이 반드시 4 차원 유클리드 공간을 나타내지는 않기 때문에 @tsh. 해밀턴은 3 차원 공간으로 작업 할 수있는 방법을 찾다가 그것들을 발견했습니다. 4D 버전을 할 수있을 것입니다하지만 난이 질문을했을 때 나는 3 차원 공간에서의 사용을 숙고했다
밝은 돈

답변:


13

Wolfram Language (Mathematica) , 67 58 바이트

Volume@BoundingRegion[Rest/@PowersRepresentations[#,4,2]]&

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

                         ...&   Pure function:
PowersRepresentations[#,4,2]    Get the sorted reprs. of # as sums of 4 2nd powers
Rest/@                         Drop the first coordinate of each
BoundingRegion[...]            Find the bounding region, a Cuboid[] or Point[].
                               By default Mathematica finds an axis-aligned cuboid.
Volume                         Find volume; volume of a Point[] is 0.

4
와우, 나는 PowersRepresentations와 같은 것이 언어로 내장 될 것이라는 것을 몰랐습니다. 나는 실제로 4 개의 제곱으로 정수를 합산하는 다른 방법을 보여주기 위해 도전하는 것에 대해 생각했지만 내가하지 않은 것을 기쁘게 생각합니다.
밝게 돈

4
Lol, Mathematica에는 이미지에서 염소를 결정하기위한 빌트인도 포함되어 있으므로이를 위해 내장 된 것이 정말 놀랍지 않습니다. xD
Kevin Cruijssen

8

젤리 , 17 바이트

Żœċ4²S⁼ɗƇ⁸ZḊṢ€I§P

온라인으로 사용해보십시오! (꽤 느리게-모든 테스트 사례 에 앞장 선다½ )

방법?

Żœċ4²S⁼ɗƇ⁸ZḊṢ€I§P - Link: non-negative integer, n    e.g. 27
Ż                 - zero-range                            [0,1,2,...,27]
   4              - literal four                          4
 œċ               - combinations with replacement         [[0,0,0,0],[0,0,0,1],...,[0,0,0,27],[0,0,1,1],[0,0,1,2],...,[27,27,27,27]]
        Ƈ         - filter keep those for which:          e.g.: [0,1,1,5]
       ɗ          -   last three links as a dyad:
    ²             -     square (vectorises)                     [0,1,1,25]
     S            -     sum                                     27
      ⁼  ⁸        -     equal to? chain's left argument, n      1
                  -                                       -> [[0,1,1,5],[0,3,3,3],[1,1,3,4]]
          Z       - transpose                             [[0,0,1],[1,3,1],[1,3,3],[5,3,4]]
           Ḋ      - dequeue                               [[1,3,1],[1,3,3],[5,3,4]]
            Ṣ€    - sort each                             [[1,1,3],[1,3,3],[3,4,5]]
              I   - incremental differences (vectorises)  [[ 0,2 ],[ 2,0 ],[ 1,1 ]]
               §  - sum each                              [2,2,2]
                P - product                               8

6

하스켈 , 132 123 바이트

z=zipWith
(!)=foldr1.z
h n=[0..n]
f n|p<-[[c,b,a]|a<-h n,b<-h a,c<-h b,d<-h c,a^2+b^2+c^2+d^2==n]=product$z(-)(max!p)$min!p

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

매우 간단한 솔루션입니다. Brute는 0에서 n까지의 모든 값을 반복하여 가능한 모든 솔루션을 강제 실행합니다 (과도한 과잉이지만 더 짧은 바이트 수). @Lynn의 마술 (!)연산자를 사용할 수 있도록 점을 목록으로 출력했습니다 . 이 연산자는 왼쪽의 함수를 사용하여 각 차원을 축소하므로 max!p각 차원의 최대 값으로 구성 min!p되고 최소값과 동일한 크기 3의 목록을 반환합니다 . 그런 다음 각 차원에서 최소 크기를 찾은 다음 (최대 값에서 최소값을 빼서 z(-)) 곱합니다.

접는 zip 마술로 9 바이트를 이륙 한 @Lynn에게 감사드립니다!


1
나는 zipWith논리 를 선호하여 전치를 잊어 버려 몇 바이트를 줄였습니다 . 123 바이트
Lynn

5

슬레지 해머 0.2, 12 바이트

⡌⢎⣟⡊⢘⣚⡏⡨⠍⠁⡇⠨

Mathematica 11.2 및 이 버전 의 Sledgehammer 와 함께 사용하십시오 . GUI가 있고 Mathematica 표현식을 생성하는 버전 0.3에서 작동하는 버전의 편집 히스토리를 참조하십시오.

입력을 스택으로 푸시하고 일련의 명령을 호출합니다.

{intLiteral[4], intLiteral[2], call["PowersRepresentations", 3], call["Thread", 1], call["Rest", 1], call["Thread", 1], call["BoundingRegion", 1], call["Volume", 1]}

이것은 Wolfram Language answer 에서 파생 된 다음 Wolfram 코드를 평가하는 것과 같습니다 .

Volume[BoundingRegion[Thread@Rest@Thread@PowersRepresentations[#, 4, 2]]]&

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


수학을 테스트하기 위해 필요한가요?
밝게 돈

@don bright 예, 저장소에 지침이 있습니다. 진행중인 작업이므로 아직 사용자 친화적이지 않습니다. setup.wls를 실행 한 후 wolframscript 또는 interactive_app.wls로 테스트 할 수 있습니다.
lirtosiast

2
@ Downgoat 예. 골프 라이브러리를 구현할 계획이지만 현재는 일반 Mathematica로 압축 해제됩니다.
lirtosiast

2
@pipe 이전 버전은 작동해야합니다 (이제 생각하면 코드는 이전 버전과 동일합니다).하지만 다운로드하여 설치를 다시 실행해야합니다. (그 이후로 변경 사항은 대부분 기능에 큰 변화가없는 GUI 및 리팩토링 코드를 작성해 왔습니다.)이 답변이 가장 짧기 때문에 자격을 증명하는 것이 중요하므로 내일 아침에 그렇게하겠습니다.
lirtosiast

1
다른 사람이 이것을 실행할 수 있습니까? 나는 그것이 '확인 표시하기 전에 작동하는지 확인하고 싶습니다.
밝게 돈

4

파이썬 2 , 138 바이트

q=lambda n,x=0,*t:[t]*(n==0)if t[3:]else q(n-x*x,x,x,*t)+q(n,x+1,*t+(0,)*(x>n))
p=1
for l in zip(*q(input()))[:3]:p*=max(l)-min(l)
print p

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

주어진 규범으로 역 분류 된 쿼터니언을 재귀 적으로 생성 한 다음 처음 세 지수에서 가능한 모든 값의 최대 값과 최소값 사이의 곱을 취합니다.

itertools 엄청나게 긴 이름을 사용하지 않았다면 itertools.combinations_with_replacement

파이썬 2 , 161 바이트

from itertools import*
n=input();p=1
for l in zip(*[t[1:]for t in combinations_with_replacement(range(n+1),4)if sum(x*x for x in t)==n]):p*=max(l)-min(l)
print p

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

이것이 itertools결코 대답이되지 않는 이유 입니다 .


3

자바 스크립트 (ES6)  148  143 바이트

n=>(r=[[],[],[]]).map(a=>p*=a.length+~a.indexOf(1),(g=(s,k=0,a=[])=>a[3]?s||r.map(r=>r[a.pop()]=p=1):g(s-k*k,k,[...a,++k],k>s||g(s,k,a)))(n))|p

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

댓글

아르 자형

r = [ [], [], [] ]

엑스1엑스+1와이

1

1 단계

아르 자형

g = (              // g is a recursive function taking:
  s,               // s   = current sum, initially set to the input n
  k = 0,           // k   = next value to be squared
  a = []           // a[] = list of selected values
) =>               //
  a[3] ?           // if we have 4 values in a[]:
    s ||           //   if s is equal to zero (we've found a valid sum of 4 squares):
      r.map(r =>   //     for each array r[] in r[]:
        r[a.pop()] //       pop the last value from a[]
        = p = 1    //       and set the corresponding value in r[] to 1
                   //       (also initialize p to 1 for later use in step 2)
      )            //     end of map()
  :                // else:
    g(             //   do a recursive call:
      s - k * k,   //     subtract k² from s
      k,           //     pass k unchanged
      [...a, ++k], //     increment k and append it to a[]
      k > s ||     //     if k is less than or equal to s:
        g(s, k, a) //       do another recursive call with s and a[] unchanged
    )              //   end of outer recursive call

2 단계

r.map(a =>         // for each array a[] in r[]:
  p *=             //   multiply p by:
    a.length +     //     the length of a[]
    ~a.indexOf(1)  //     minus 1, minus the index of the first 1 in a[]
) | p              // end of map(); return p



1

하스켈 , 108 바이트

n%i=sum[maximum[t!!i*b|t<-mapM([0..n]<$f)[0..3],sum(map(^2)t)==n,scanr1 max t==t]|b<-[-1,1]]
f n=n%0*n%1*n%2

온라인으로 사용해보십시오! (더 큰 테스트 사례에서 시간 초과)

여기에 이상한 최적화가 있습니다. 계산하기 maximum l-minimum l목록은 l주어진 위치에있는 요소, 그것은 두 번째 임기를 부정함으로써 최대로 모두 변환하는 상황에서 짧은 밝혀 : maximum l+maximum(map((-1)*))l또는 동등 sum[maximum$map(b*)l||b<-[-1,1]].

3 차원을 곱하기 f n=n%0*n%1*n%2위해서는 어떤 종류의 루프를 사용하는 것보다 제품을 작성하는 것이 더 짧습니다 . 여기에서 인덱싱으로 추출 된 '좌표 값 n%i의 최소값과 최대 값의 차이 입니다.i!!i

유효한 4 개의 튜플을 생성하기 위해, 우리 [0..n]는 제곱의 합계 n에서 내림차순 으로 4 개의 숫자 목록을 가져옵니다 . 우리는 twith 의 역 분류를 점검하는데 scanr1 max t==t, 이는 Haskell이 값 비싼 수입없이 내장 된 정렬을 가지고 있지 않기 때문에 역행의 최대 값이 그 자체인지 확인합니다. 파이썬 답변과 같이 4 개의 튜플을 재귀 적으로 생성하는 다양한 방법을 시도했지만 모두이 무차별 강제 생성 및 필터링 방법보다 길었습니다.

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