Rationals'in dot ürününü bulun


31

Akşam yemeğinde bir arkadaşımın evindeydim ve "Asal faktör vektör alanı" fikrini önerdiler. Bu boşlukta pozitif tamsayılar, bir vektör olarak ifade edilir, öyle ki vektördeki n. Eleman n'in en büyükünün sayıyı böldüğü sayıdır. (Not eden vektörler terimlerin. Sonsuz sayıda bu araçlarının) Örnek 20 olduğu

2 0 1 0 0 0 ...

Çünkü asal çarpanlara ayırma 2 * 2 * 5'tir .

Asal çarpanlara ayırma benzersiz olduğundan, her sayı bir vektöre karşılık gelir.

Girdilerini çift olarak ekleyerek vektörler ekleyebiliriz. Bu, ilişkilendirildikleri sayıları çarpmakla aynıdır. Ayrıca, ilişkili sayıyı bir güce yükseltmek gibi bir skaler çarpım da yapabiliriz.

Sorun, bu uzayın aslında bir vektör uzayı olmamasıdır çünkü tersi yoktur. Devam edersek, tersleri eklersek ve vektör uzayını kapatırsak, şimdi her pozitif rasyonel sayıyı bir vektör olarak ifade etmenin bir yolunu buluruz. Vektör eklemenin çarpımı temsil ettiği gerçeğini sürdürürsek. O zaman doğal sayının tersi, onun karşılığıdır.

Örneğin, 20 numara vektöre sahipti.

2 0 1 0 0 0 ...

Yani 1/20 kesri tersidir

-2 0 -1 0 0 0 ...

Biz böyle bir fraksiyon ile birleştirildi vektörü bulmak isterseniz 14/15 biz bulacağını 14

1 0 0 1 0 0 ...

ve 1/15

0 -1 -1 0 0 0 ...

ve vektör eklemesi yaparak bunları çoğaltın

1 -1 -1 1 0 0 ...

Şimdi bir vektör uzayımız olduğuna göre, onu bir iç ürün vererek bir iç ürün alanı oluşturmak için değiştirebiliriz. Bunu yapmak için, vektör uzaylarının klasik olarak verildiği iç çarpımı çalarız. İki vektörün iç çarpımı terimlerinin çiftli çarpımının toplamı olarak tanımlanır. Örneğin, 20 · 14/15 aşağıdaki gibi hesaplanır

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

Başka bir örnek olarak ürün 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

Göreviniz bu nokta ürününü gerçekleştiren bir program uygulamak. Bir çift pozitif tamsayı (pay ve payda) veya rasyonel bir tip (yüzdürmelere izin verilmez, çünkü hassasiyet ve bölünebilirlikle ilgili sorunlara neden olurlar) aracılığıyla iki pozitif rasyonel sayı almalı ve ikisinin nokta ürününü temsil eden bir tamsayı çıkarmalıdır. girişleri.

Bu bu nedenle cevaplar daha az byte'ın daha iyi olmasıyla byte olarak puanlanacaktır.

Test Kılıfları

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

Bir vektörün bir boyutu yoktur, bir vektörün alanı vardır.
Jonathan Frech

5
@JonathanFrech Bence biraz sersemletici, ama ben değişimi yaptım.
Buğday Sihirbazı

"Doğal sayılar" genellikle sisteminizde temsil edilmeyen 0 içerdiği anlaşılmaktadır. Ve bunlar vektör değil. Bir vektör uzayı alanın üzerindedir ve bu bir halkanın üzerindedir ve bu onu bir modül haline getirir. Ve bu tamsayılardan ayrı bir alan değil, farklı bir gösterimle aynı alan.
Birikim

6
@ Birikim "Doğal sayılar", kime sorduğunuza veya sıfır içermediğine bağlı olarak iyi tanımlanmış bir terim değildir. Benim sorumdaki "skalar çarpımının" bir gruptan ziyade monoidli bir G seti oluşturduğu, ancak soruyu zevkli hale getirmek için basitleştirildiği doğru. Son yorumunuzda ne yapmanız gerektiğinden emin değilim, tamsayılarla aynı kardinalliğe sahip olduğundan emin olun, ancak eylem aslında boyutu değil, bir alanı tanımlayan şeydir. Belki de özlediğim daha özel bir şey demek istiyorsun. Öyleyse bu tartışmaya devam etmekten mutlu olurum (sohbette en iyisi olabilir).
Buğday Sihirbazı

2
Başka bir terminoloji nit-pick: Vektör uzayları genellikle bir alandan skalar çarpımına ihtiyaç duyarlar, bu yüzden sadece tamsayıları kullanmak yeterli değildir. Çünkü paralel vektörlerin birbirlerinin katları olmasını istiyoruz, sadece bazı ortak noktalara sahip değiliz. Örneğin, $ 4 $ ve $ 8 $, bu alandaki paralel "vektörler" dir (ikisi de (a, 0, ...) şeklindedir), ancak bunların hiçbiri skalar bir kat değildir (yani bir tamsayı gücü). diğer. Bununla birlikte, genel olarak insanlar tarafından bilinecek olan, gerçekten kullanabileceğiniz pek çok terim yoktur. "Tam sayılar üzerinden ücretsiz modül" yapabildiğim en iyi şey.
Arthur,

Yanıtlar:


4

MATL , 12 bayt

YF2:&Y)dwd*s

Giriş bir dizidir [num1 den1 num2 den2].

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

Örnek girişi düşünün [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 bayt

  • 32 bayt gerektiren bir derleyici bayrağı kullanma -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;}

Çevrimiçi deneyin!


Açıkça ek bayrağın -D=F(v,V,e)for(;v%p<1;V+=e)v/=p;(32 bayt) kullanıldığını belirtmenin daha iyi olacağını düşünüyorum (bu yüzden 99 + 32 = 131); Aksi halde kod tek başına çok az anlam ifade eder.
Bubbler


3

Python 2,110 bayt

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

Çevrimiçi deneyin!

Gibi girdi alır [num1, num2, den1, den2]. İki gerekçe riçin asal girişleri saklamak ve ürünlerini toplamın içine çıkarmak için karmaşık bir sayı kullanır . Ekleme için arttırılması veya dört giriş numaraları için gerçek ya da hayali bir kısmını kademeli olarak azaltılması her kombinasyonunu yapar.p(r*r).imag/2r.real*r.imagt1j**ii=0,1,2,3

Bubbler, ilk değerleri birleştirerek 2 bayt kaydetti p=t=2.


1
p=t=2yerine p=2;t=0beri t.real(zaten yok sayılır TIO ).
Bubbler

@ Baloncu Güzel, ekleyerek!
Xnor


1

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

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)

Çevrimiçi deneyin!

Numaraları [Num1, Den1, Num2, Den2] dizisi olarak geçirin.

Arnauld için, eksik F=olan fazladan bayt olmayan ve 2 bayt daha az olan düzeltmeler için teşekkür ederiz .

Açıklama ve 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 bayt

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

Çevrimiçi deneyin!

Açıklama:

İkili bir fiil, argümanlar hem sol hem de sağ tarafta

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

ä÷ß½♂←√:=Ü]

Koş ve hata ayıkla

Aynı programın karşılık gelen ascii gösterimi budur.

{|nmMFE-~-,*+

Temel olarak, her bir bölüm için ana faktörleşmenin üslerini alır. Her bir çiftin, ardından ürünün farkını alır ve sonunda tüm sonuçları toplar.


1

Python 2 , 133 127 bayt

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

Çevrimiçi deneyin!

Döngü koşulunu xnor'ın gönderiminden çaldı .

@Mathmandan'ın fonksiyonu bir program haline getirme tavsiyesi için teşekkür ederiz (Evet, gerçekten de bazı baytlar kaydedildi).

Eski, yanlış çözüm (124 bayt):

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 gibi asal olmayan değerleri test etmeyecek mi?
xnor

Hata! Yakında düzelteceğim.
Bubbler

3
Sen yerini alabilir returnile printve bir programın yerine bir fonksiyonu olarak yazarsanız da girinti boşluk kaydedebilirsiniz.
mathmandan

@ mathmandan Bilgi için teşekkürler. Diğer Py2 gönderimlerim için faydalı görünüyor, Py3'ten emin değilim ( eval()işlev girişi bir dize olmadıkça fazladan sürer ).
Bubbler

1

Haskell , 153 bayt

(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

Çevrimiçi deneyin! Örnek kullanımı 20 · 14/15: (2%) [20,1,14,15].

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.