합리성의 내적 찾기


31

나는 저녁 식사를 위해 친구의 집에 있었고 "프라임 팩터 벡터 공간"이라는 아이디어를 제안했습니다. 이 공간에서 양의 정수는 벡터로 표현되어 벡터의 n 번째 요소가 n 번째 소수가 숫자를 나누는 횟수가되도록합니다. (이것은 벡터에 무한한 수의 항이 있다는 것을 의미합니다.) 예를 들어 20

2 0 1 0 0 0 ...

소인수 분해가 2 * 2 * 5 이므로 .

소인수 분해가 고유하기 때문에 각 숫자는 하나의 벡터에 해당합니다.

항목을 쌍으로 추가하여 벡터를 추가 할 수 있습니다. 이것은 관련된 숫자를 곱하는 것과 같습니다. 또한 스칼라 곱셈을 수행 할 수 있는데, 이는 연관된 숫자를 거듭 제곱하는 것과 유사합니다.

문제는이 공간이 실제로 벡터 공간이 아니라는 것입니다. 계속해서 역수를 더하고 벡터 공간을 닫으면 모든 양의 유리수를 벡터로 표현할 수 있습니다. 벡터 덧셈은 곱셈을 나타냅니다. 그런 다음 자연수의 역수는 역수입니다.

예를 들어 숫자 20 에는 벡터가있었습니다

2 0 1 0 0 0 ...

분수 1/20 은 그 역수입니다

-2 0 -1 0 0 0 ...

14/15 와 같은 분수와 관련된 벡터를 찾으려면 14를 찾습니다

1 0 0 1 0 0 ...

그리고 1/15

0 -1 -1 0 0 0 ...

벡터 덧셈을 수행하여 곱하십시오

1 -1 -1 1 0 0 ...

이제 벡터 공간이 생겼으므로 내부 제품을 제공하여 내부 제품 공간을 형성하도록 벡터 공간을 수정할 수 있습니다. 이를 위해 우리는 벡터 공간이 고전적으로 주어진 내부 생성물을 훔칩니다. 두 벡터의 내부 곱은 항의 쌍별 곱셈의 합으로 정의됩니다. 예를 들어 20 · 14/15 는 다음과 같이 계산됩니다.

20    =  2  0  1  0  0  0 ...
14/15 =  1 -1 -1  1  0  0 ...
         2  0 -1  0  0  0 ...  -> 1

다른 예로 제품 2/19 · 4/19

2/19 = 1 0 0 0 0 0 0 -1 0 0 0 ...
4/19 = 2 0 0 0 0 0 0 -1 0 0 0 ...
       2 0 0 0 0 0 0  1 0 0 0 ... -> 3

당신의 임무는이 내적을 수행하는 프로그램을 구현하는 것입니다. 양의 정수 쌍 (분자 및 분모) 또는 합리적 유형 (정밀도와 나누기 문제가 발생하기 때문에 부동 소수점이 허용되지 않음)을 통해 양의 양의 유리수를 가져와야하며,이 둘의 내적을 나타내는 정수를 출력해야합니다. 입력.

이것은 이므로 바이트 수가 적을수록 답이 바이트로 표시됩니다.

테스트 사례

4 · 4 = 4
8 · 8 = 9
10 · 10 = 2
12 · 12 = 5
4 · 1/4 = -4
20 · 14/15 = 1
2/19 · 4/19 = 3

벡터에는 치수가없고 벡터 공간에는 치수가 없습니다.
Jonathan Frech

5
@JonathanFrech 나는 조금 비관적이라고 생각하지만 변경했습니다.
밀 마법사

"자연수"는 일반적으로 시스템에 표시되지 않는 0을 포함하는 것으로 이해됩니다. 그리고 이것은 벡터가 아닙니다. 벡터 공간은 필드 위에 있고 이것은 링 위에 있으며,이를 모듈로 만듭니다. 정수와 분리 된 공간이 아니며 표현이 다른 동일한 공간입니다.
Accumulation

6
@Acccumulation "자연수"는 요청한 사람에 따라 0을 포함하거나 포함하지 않는 용어에 따라 잘 정의 된 용어가 아닙니다. 내 질문의 "스칼라 곱셈"이 그룹이 아닌 모노 이드를 가진 G- 세트를 형성하는 것이 맞지만 질문을 맛있게 만들기 위해 단순화되었습니다. 마지막 주석을 어떻게 작성 해야할지 잘 모르겠습니다. 정수와 동일한 카디널리티를 가지고 있는지 확인하십시오. 그러나 작업은 실제로 크기가 아닌 공간을 정의하는 것입니다. 아마도 당신은 내가 놓친 더 구체적인 것을 의미 할 것입니다. 그렇다면이 토론을 계속할 수있어서 기쁩니다 (채팅에서 가장 좋을 수도 있음).
밀 마법사

2
또 다른 용어 nit-pick : 벡터 공간은 일반적으로 필드에서 스칼라 곱셈을 요구하므로 정수를 사용하는 것만으로는 충분하지 않습니다. 병렬 벡터가 서로의 배수가되기를 원하기 때문입니다. 예를 들어, $ 4 $와 $ 8 $는이 공간에서 평행 한 "벡터"(둘 다 형식 (a, 0, 0, ...))이지만 스칼라 배수 (정수 제곱)도 아닙니다. 다른. 하지만 일반적으로 사람들에게 알려진 다른 용어는 많지 않습니다. "정수보다 자유로운 모듈"은 내가 할 수있는 최선입니다.
Arthur

답변:


4

MATL , 12 바이트

YF2:&Y)dwd*s

입력은 배열 [num1 den1 num2 den2]입니다.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

예제 입력을 고려하십시오 [20 1 14 15].

YF      % Implicit input: array of 4 numbers. Exponents of prime factorization.
        % Gives a matrix, where each row corresponds to one of the numbers in
        % the input array. Each row may contain zeros for non-present factors
        % STACK: [2 0 1 0
                  0 0 0 0
                  1 0 0 1
                  0 1 1 0]
2:&Y)   % Push a submatrix with the first two rows, then a submatrix with the
        % other two rows
        % STACK: [2 0 1 0
                  0 0 0 0],
                 [1 0 0 1
                  0 1 1 0]
d       % Consecutive difference(s) along each column
        % STACK: [2 0 1 0
                  0 0 0 0],
                 [-1 1 -1 1]
wd      % Swap, and do the same for the other submatrix
        % STACK: [-1 1 -1 1]
                 [-2 0 -1 0]
*       % Element-wise product
        % STACK: [2 0 -1 0]
s       % Sum. Implicit display
        % STACK: 1

4

C (gcc) , 99 + 32 = 131 바이트

  • 32 바이트를 필요로하는 컴파일러 플래그를 사용 -D=F(v,V,e)for(;v%p<1;V+=e)v/=p;.
T,p,A,C;f(a,b,c,d){T=0;for(p=2;a+b+c+d>4;p++){A=C=0;F(a,A,1)F(b,A,~0)F(c,C,1)F(d,C,~0)T+=A*C;}a=T;}

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


추가 플래그 -D=F(v,V,e)for(;v%p<1;V+=e)v/=p;(32 바이트)가 사용되도록 명시 적으로 지정하는 것이 좋습니다 (그래서 99 + 32 = 131). 그렇지 않으면 코드만으로는 의미가 없습니다.
Bubbler


3

파이썬 2 , 110 바이트

l=input()
p=t=2
while~-max(l):r=i=0;exec"while l[i]%p<1:l[i]/=p;r+=1j**i\ni+=1\n"*4;t+=r*r;p+=1
print t.imag/2

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

같은 입력을 [num1, num2, den1, den2]받습니다. 복소수를 사용 하여 두 가지 합리성에 r대한 소수 항목을 저장하고 전체 합계 내에서 제품을 추출합니다 . 추가 에 대한 것은 증가 또는 4 개 개의 입력 번호에 대한 실수 또는 허수 부분을 감소시키는의 각 조합을 수행합니다.p(r*r).imag/2r.real*r.imagt1j**ii=0,1,2,3

버블 러는 초기 값을 결합하여 2 바이트를 절약했습니다 p=t=2.


1
p=t=2대신 p=2;t=0때문에 t.real(어쨌든 무시 TIO ).
Bubbler 2019

@Bubbler 멋진 하나, 추가!
xnor


1

JavaScript (Node.js) , 104 ... 100 94 바이트

F=(A,i=2)=>A.some(x=>x>1)&&([a,b,c,d]=A.map(G=(x,j)=>x%i?0:1+G(A[j]/=i,j)),a-b)*(c-d)+F(A,i+1)

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

숫자를 [Num1, Den1, Num2, Den2]의 배열로 전달하십시오.

F=추가 바이트없이 누락 된 부분을 수정 하고 2 바이트 더 적은 Arnauld에 감사드립니다 .

설명 및 언 골프

function F(A, i = 2) {                 // Main function, recursing from i = 2
 if (A.some(function(x) {              // If not all numbers became 1:
  return x > 1;
 })) {
  var B = A.map(G = function(x, j) {   // A recursion to calculate the multiplicity
   if (x % i)
    return 0;
   else
    return 1 + G(A[j] /= i, j);        // ...and strip off all powers of i
  });
  return (B[0] - B[1]) * (B[2] - B[3]) // Product at i
   + F(A, i + 1);                      // Proceed to next factor. All composite factors 
 }                                     // will be skipped effectively
 else 
  return 0;                            // Implied in the short-circuit &&
}

1

J , 19 바이트

1#.*/@,:&([:-/_&q:)

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

설명:

이 동사, 인수는 왼쪽과 오른쪽에 있습니다

         &(        ) - for both arguments (which are lists of 2 integers)
               _&q:  - decompose each number to a list of prime exponents
           [:-/      - and find the difference of these lists
       ,:            - laminate the resulting lists for both args (to have the same length)
   */@               - multiply them
1#.                  - add up 

1

Stax , 11 바이트

ä÷ß½♂←√:=Ü]

실행 및 디버깅

동일한 프로그램의 해당 ASCII 표현은 이렇습니다.

{|nmMFE-~-,*+

기본적으로 각 부분에 대한 소인수 분해 지수를 얻습니다. 각 쌍의 차이와 곱을 취하여 마지막으로 모든 결과를 합산합니다.


1

파이썬 2 , 133127 바이트

a=input();s=0;p=2;P=lambda n,i=0:n%p and(n,i)or P(n/p,i+1)
while~-max(a):a,(w,x,y,z)=zip(*map(P,a));s+=(w-x)*(y-z);p+=1
print s

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

xnor의 제출 에서 루프 조건을 훔쳤습니다 .

함수를 프로그램으로 변경하라는 @mathmandan의 조언에 감사드립니다 (예, 실제로 약간의 바이트를 절약했습니다).

더 이상 사용되지 않는 잘못된 솔루션 (124 바이트) :

lambda w,x,y,z:sum((P(w,p)-P(x,p))*(P(y,p)-P(z,p))for p in[2]+range(3,w+x+y+z,2))
P=lambda n,p,i=1:n%p and i or P(n/p,p,i+1)

아닌가요 p9와 같은 비 프라임 값을 테스트하는 것?
xnor

죄송합니다. 곧 수정하겠습니다.
Bubbler

3
당신은 대체 할 수 return와 함께 print, 당신은 프로그램 대신 함수로 작성하는 경우 당신은 또한 들여 쓰기 공간을 절약 할 수 있습니다.
mathmandan

@mathmandan 정보 주셔서 감사합니다. Py3에 대해서는 확실하지 않은 다른 Py2 제출에 유용합니다 ( eval()함수 입력 자체가 문자열이 아닌 한 추가 비용이 듭니다 ).
Bubbler

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