Tìm sản phẩm chấm của Rationals


31

Tôi đang ở nhà một người bạn để ăn tối và họ đề xuất ý tưởng về "không gian vectơ nhân tố chính". Trong không gian này, các số nguyên dương được biểu thị dưới dạng một vectơ sao cho phần tử thứ n trong vectơ là số lần số nguyên tố thứ n chia số. (Lưu ý rằng điều này có nghĩa là các vectơ của chúng ta có số lượng thuật ngữ vô hạn.) Ví dụ 20

2 0 1 0 0 0 ...

Bởi vì hệ số nguyên tố của nó là 2 * 2 * 5 .

Vì hệ số nguyên tố là duy nhất nên mỗi số tương ứng với một vectơ.

Chúng ta có thể thêm vectơ bằng cách thêm cặp của chúng. Điều này giống như nhân số mà chúng được liên kết. Chúng ta cũng có thể thực hiện phép nhân vô hướng, giống như tăng số liên kết lên một lũy thừa.

Vấn đề là không gian này trên thực tế không phải là không gian vectơ vì không có nghịch đảo. Nếu chúng ta tiếp tục và thêm các nghịch đảo và đóng không gian vectơ, bây giờ chúng ta có một cách để biểu thị mọi số hữu tỷ dương dưới dạng một vectơ. Nếu chúng ta giữ thực tế rằng phép cộng vector đại diện cho phép nhân. Khi đó nghịch đảo của một số tự nhiên là đối ứng của nó.

Ví dụ số 20 có vectơ

2 0 1 0 0 0 ...

Vì vậy, tỷ lệ 1/20 là nghịch đảo của nó

-2 0 -1 0 0 0 ...

Nếu chúng ta muốn tìm vectơ liên kết với một phân số như 14/15, chúng ta sẽ tìm thấy 14

1 0 0 1 0 0 ...

1/15

0 -1 -1 0 0 0 ...

và nhân chúng bằng cách thực hiện phép cộng vector

1 -1 -1 1 0 0 ...

Bây giờ chúng ta có một không gian vectơ, chúng ta có thể sửa đổi nó để tạo thành một không gian sản phẩm bên trong bằng cách cho nó một sản phẩm bên trong. Để làm điều này, chúng tôi đánh cắp sản phẩm bên trong rằng các không gian vectơ được đưa ra một cách cổ điển. Tích trong của hai vectơ được định nghĩa là tổng của phép nhân theo cặp của các số hạng của chúng. Ví dụ 20 · 14/15 sẽ được tính như sau

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

Một ví dụ khác là sản phẩm 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

Nhiệm vụ của bạn là thực hiện một chương trình thực hiện sản phẩm chấm này. Cần lấy hai số hữu tỷ dương thông qua một cặp số nguyên dương (tử số và mẫu số) hoặc loại hợp lý (số float không được phép, vì chúng gây ra vấn đề với độ chính xác và chia hết) và nên xuất ra một số nguyên biểu thị sản phẩm chấm của hai đầu vào.

Đây là vì vậy câu trả lời sẽ được tính bằng byte với ít byte hơn.

Các trường hợp thử nghiệm

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

Một vectơ không có thứ nguyên, một không gian vectơ nào.
Jonathan Frech

5
@JonathanFrech Tôi nghĩ rằng đó là một chút mô phạm, nhưng tôi đã thực hiện thay đổi.
Thuật sĩ lúa mì

"Số tự nhiên" thường được hiểu là chứa 0, không được biểu thị trong hệ thống của bạn. Và đây không phải là vectơ. Một không gian vectơ nằm trên một trường và điều này nằm trên một vòng, điều này sẽ biến nó thành một mô-đun. Và nó không phải là một không gian riêng biệt với các số nguyên, đó là cùng một không gian với một đại diện khác.
Tích lũy

6
@Acccumulation "Số tự nhiên" không phải là một thuật ngữ được xác định rõ, tùy thuộc vào người bạn hỏi nó có thể có hoặc không chứa số không. Bạn đúng rằng "phép nhân vô hướng" trong câu hỏi của tôi tạo thành một tập hợp G với một đơn hình thay vì một nhóm, nhưng điều đó đã được đơn giản hóa cho các mục đích làm cho câu hỏi trở nên ngon miệng. Tôi không chắc chắn những gì để đưa ra nhận xét cuối cùng của bạn, chắc chắn rằng nó có cùng số lượng với số nguyên, nhưng hành động thực sự là thứ xác định một không gian không phải là kích thước của nó. Có lẽ bạn có nghĩa là một cái gì đó cụ thể hơn mà tôi đang thiếu. Nếu vậy tôi rất vui khi tiếp tục cuộc thảo luận này (trong trò chuyện có thể là tốt nhất).
Thuật sĩ lúa mì

2
Một thuật ngữ chọn nit khác: Không gian vectơ thường được yêu cầu để nhân vô hướng từ một trường, vì vậy chỉ cần sử dụng số nguyên là không đủ. Đó là bởi vì chúng tôi muốn các vectơ song song là bội số của nhau, không chỉ có nhiều điểm chung. Chẳng hạn, $ 4 $ và $ 8 $ là các "vectơ" song song trong không gian này (cả hai đều có dạng (a, 0, 0, ...)), nhưng không phải là bội số vô hướng (nghĩa là một số nguyên) khác Tuy nhiên, thực sự không có nhiều thuật ngữ khác mà bạn có thể sử dụng mà mọi người sẽ biết. "Mô-đun miễn phí trên các số nguyên" là cách tốt nhất tôi có thể làm.
Arthur

Câu trả lời:


4

MATL , 12 byte

YF2:&Y)dwd*s

Đầu vào là một mảng [num1 den1 num2 den2].

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

Xem xét ví dụ đầu vào [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 byte

  • Sử dụng cờ trình biên dịch yêu cầu 32 byte , -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;}

Hãy thử trực tuyến!


Tôi nghĩ tốt hơn là chỉ định rõ ràng rằng cờ bổ sung -D=F(v,V,e)for(;v%p<1;V+=e)v/=p;(32 byte) được sử dụng (vì vậy 99 + 32 = 131); nếu không thì mã một mình làm cho ít ý nghĩa.
Bong bóng


3

Python 2 , 110 byte

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

Hãy thử trực tuyến!

Đưa đầu vào như thế nào [num1, num2, den1, den2]. Sử dụng một số phức rđể lưu trữ các mục nhập cho số nguyên tố pcho hai tỷ lệ hợp lý và (r*r).imag/2để trích xuất sản phẩm của chúng r.real*r.imagtrong tổng số tiền t. Thêm vào 1j**icho i=0,1,2,3mỗi kết hợp tăng hoặc giảm phần thực hoặc phần ảo cho bốn số đầu vào.

Bubbler lưu 2 byte kết hợp các giá trị ban đầu p=t=2.


1
p=t=2thay vì p=2;t=0kể từ đó t.realđược bỏ qua ( TIO ).
Bong bóng

@Bubbler Đẹp một, thêm!
xnor


1

JavaScript (Node.js) , 104 ... 100 94 byte

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)

Hãy thử trực tuyến!

Truyền các số dưới dạng một mảng của [Num1, Den1, Num2, Den2].

Cảm ơn Arnauld vì đã sửa lỗi bị thiếu F=mà không có thêm byte và thêm 2 byte nữa.

Giải thích & vô lương tâm

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 byte

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

Hãy thử trực tuyến!

Giải trình:

Một động từ dyadic, đối số ở cả bên tay trái và bên phải

         &(        ) - 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 byte

ä÷ß½♂←√:=Ü]

Chạy và gỡ lỗi nó

Đại diện ascii tương ứng của cùng một chương trình là đây.

{|nmMFE-~-,*+

Về cơ bản, nó nhận được số mũ của thừa số nguyên tố cho từng phần. Nó lấy sự khác biệt của từng cặp, sau đó là sản phẩm và cuối cùng là tổng hợp tất cả các kết quả.


1

Python 2 , 133 127 byte

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

Hãy thử trực tuyến!

Lấy trộm điều kiện vòng lặp từ trình của xnor .

Cảm ơn lời khuyên của @mathmandan để thay đổi chức năng thành một chương trình (Có, nó thực sự đã lưu một số byte).

Giải pháp lỗi thời, không chính xác (124 byte):

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)

Sẽ không pkiểm tra các giá trị không chính như 9?
xnor

Rất tiếc, tôi sẽ sửa nó sớm.
Bong bóng

3
Bạn có thể thay thế returnbằng printvà bạn cũng có thể lưu các khoảng trắng thụt nếu bạn viết dưới dạng chương trình thay vì hàm.
mathmandan

@mathmandan Cảm ơn thông tin. Có vẻ hữu ích cho các lần gửi Py2 khác của tôi, tuy nhiên không chắc chắn cho Py3 (phải mất thêm eval()trừ khi chính hàm nhập là một chuỗi).
Bong bóng

1

Haskell , 153 byte

(2%)
n%m|all(<2)m=0|(k,[a,b,c,d])<-unzip[(,)=<<div x.max 1.(n*)$until((>0).mod x.(n^))(+1)1-1|x<-m]=(a-b)*(c-d)+[i|i<-[n..],all((>0).rem i)[2..i-1]]!!1%k

Hãy thử trực tuyến! Ví dụ sử dụng cho 20 · 14/15: (2%) [20,1,14,15].

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.