ค้นหาผลิตภัณฑ์ดอทของ Rationals


31

ฉันอยู่ที่บ้านเพื่อนเพื่อทานอาหารค่ำและพวกเขาแนะนำแนวคิดของ "พื้นที่เวกเตอร์ไพรม์แฟคเตอร์" ในพื้นที่นี้จำนวนเต็มบวกจะแสดงเป็นเวกเตอร์ดังกล่าวที่n TH องค์ประกอบในเวกเตอร์คือจำนวนครั้งที่n TH แบ่งนายกจำนวน (โปรดทราบว่านี่หมายความว่าเวกเตอร์ของเรามีจำนวนคำไม่ จำกัด ) ตัวอย่างที่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 ซึ่งไม่ได้แสดงอยู่ในระบบของคุณ และนี่ไม่ใช่เวกเตอร์ เวกเตอร์สเปซอยู่เหนือสนามและนี่คือวงแหวนซึ่งจะทำให้โมดูลนี้ และมันไม่ได้เป็นช่องว่างแยกต่างหากจากจำนวนเต็มมันเป็นพื้นที่เดียวกันกับการเป็นตัวแทนที่แตกต่างกัน
สะสม

6
@ การคำนวณ "ตัวเลขธรรมชาติ" ไม่ใช่คำศัพท์ที่กำหนดขึ้นอยู่กับบุคคลที่คุณถามอาจมีหรือไม่มีศูนย์ คุณถูกต้องแล้วว่า "การคูณสเกลาร์" ในคำถามของฉันเป็นชุด G ที่มี monoid มากกว่ากลุ่ม แต่มันง่ายสำหรับวัตถุประสงค์ในการทำให้คำถามเป็นที่พอใจ ฉันไม่แน่ใจว่าสิ่งที่จะทำให้ความคิดเห็นล่าสุดของคุณให้แน่ใจว่ามันมีความสำคัญเชิงซ้อนเท่ากับจำนวนเต็ม แต่การกระทำเป็นสิ่งที่กำหนดพื้นที่ไม่ได้เป็นขนาดจริง บางทีคุณอาจหมายถึงบางสิ่งที่เฉพาะเจาะจงมากกว่าที่ฉันคิดถึง ถ้าเป็นเช่นนั้นฉันยินดีที่จะดำเนินการสนทนานี้ต่อ (ในการแชทอาจจะดีที่สุด)
ข้าวสาลีตัวช่วยสร้าง

2
คำศัพท์อื่น nit-pick: ปริภูมิเวกเตอร์โดยทั่วไปจะต้องมีการคูณสเกลาร์จากฟิลด์ดังนั้นการใช้จำนวนเต็มจึงไม่เพียงพอ นั่นเป็นเพราะเราต้องการเวกเตอร์คู่ขนานเป็นทวีคูณของกันและกันไม่ใช่แค่มีพหุคูณเหมือนกัน ตัวอย่างเช่น $ 4 $ และ $ 8 $ เป็น "เวกเตอร์" แบบขนานในพื้นที่นี้ (ทั้งคู่เป็นแบบฟอร์ม (a, 0, 0, ... )) แต่ไม่มีสเกลาร์หลายตัว (เช่นพลังงานจำนวนเต็ม) ของ อื่น ๆ ไม่มีคำอื่น ๆ อีกมากมายที่คุณสามารถใช้ได้แม้ว่าคนทั่วไปจะรู้จักกันดี "โมดูลฟรีมากกว่าจำนวนเต็ม" เป็นสิ่งที่ดีที่สุดที่ฉันสามารถทำได้
อาเธอร์

คำตอบ:


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

Python 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ในการจัดเก็บรายการสำหรับนายกpสำหรับสอง rationals และ (r*r).imag/2เพื่อดึงผลิตภัณฑ์ของตนภายในโดยรวมรวมr.real*r.imag tการเพิ่ม1j**iการi=0,1,2,3รวมกันของการเพิ่มหรือการลดส่วนที่เป็นของจริงหรือจินตภาพของตัวเลขสี่ตัว

Bubbler บันทึก 2 ไบต์รวมค่าเริ่มต้นp=t=2แล้ว


1
p=t=2แทนที่จะเป็นp=2;t=0ตั้งแต่t.realนั้นจะถูกละเว้นต่อไป ( TIO )
Bubbler

@Bubbler Nice หนึ่งเพิ่ม!
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]

ขอบคุณสำหรับ Arnauld สำหรับการแก้ไขสิ่งที่ขาดหายไปF=โดยไม่มีไบต์พิเศษและ 2 ไบต์เพิ่มเติมน้อยลง

คำอธิบาย & ungolfed

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:)

ลองออนไลน์!

คำอธิบาย:

คำกริยา dyadic ข้อโต้แย้งอยู่ทั้งด้านซ้ายและด้านขวามือ

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

Python 2 , 133 127 ไบต์

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)

pจะไม่ทดสอบค่าที่ไม่ใช่ค่าเฉพาะอย่าง 9 หรือไม่
xnor

โอ๊ะฉันจะแก้ไขเร็ว ๆ นี้
Bubbler

3
คุณสามารถแทนที่returnด้วยprintและคุณยังสามารถบันทึกเว้นวรรคเยื้องถ้าคุณเขียนเป็นโปรแกรมแทนฟังก์ชั่น
mathmandan

@ Mathmandan ขอบคุณสำหรับข้อมูล รูปลักษณ์ที่มีประโยชน์สำหรับการส่ง Py2 อื่น ๆ ของฉันไม่แน่ใจสำหรับ Py3 แม้ว่า (มันจะใช้เวลาพิเศษeval()เว้นแต่การป้อนข้อมูลฟังก์ชั่นของตัวเองเป็นสตริง)
Bubbler

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.