Kongruent Sayıları


21

Tanımlar:

  • İç açılardan biri tam olarak 90 derece ise, bir üçgen sağ üçgen olarak kabul edilir .
  • Bir dizi olarak kabul edilir rasyonel bu tamsayılar oranı ile temsil edilen, diğer bir deyişle edilebilirse p/q, burada her ikisi de pve qtamsayılardır.
  • Bir dizi nbir olan uyumlu sayı alanının bir dik üçgen vardır eğer nher üç tarafın mantıklı.
  • Bu, OEIS A003273 .

Meydan okuma

Bu bir . Bir giriş numarası verildiğinde, uygun bir sayı ise x, farklı ve tutarlı bir değer ve uygun xbir sayı değilse , ayrı ve tutarlı bir değer verin x. Çıktı değerlerinin dilinizde truthy / falsey olması gerekmez.

Özel kural

Bu zorluğun amaçları doğrultusunda, Birch ve Swinnerton-Dyer varsayımının doğru olduğunu kabul edebilirsiniz . Alternatif olarak, Birch ve Swinnerton-Dyer düşüncesini ispatlayabilirseniz 1.000.000 $ Millennium ödülünüzü alın. ;-)

Örnekler

(Uygun Truesayılar için ve diğerlerini kullanarak False).

5 True
6 True
108 False

Kurallar ve Açıklamalar

  • Giriş ve çıkış herhangi bir uygun yöntemle verilebilir .
  • Sonucu STDOUT'a yazdırabilir veya işlev sonucu olarak geri döndürebilirsiniz. Lütfen gönderiminizde çıktının alabileceği değerleri belirtin.
  • Tam bir program veya bir işlev kabul edilebilir.
  • Standart boşluklar yasaktır.
  • Bu olduğundan, tüm normal golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

3
Giriş pozitif bir tamsayı mı?
Lynn

Benim ilk yaklaşımım, bir Pisagor üçlüsünde bacakların ürününün yarısı kadar girdiyi isteğe bağlı bir kare sayıyla çarpmaktı, ancak daha sonra uyumsuz bir girdi için sonlandırmanın biraz zor olabileceğini fark ettim.
İlişkisiz String

@ Xi'an Tamam, ancak zorluklar kendi kendine yetmeli.
Lynn

@Lynn Evet, giriş pozitif bir tamsayı olacak.
AdmBorkBork

Yanıtlar:


8

R, 179 173 142 141 137 135 134 bayt

Dayanan aynı argümanları kullanarak Tunnell teoremi , döner bir 0eğer nuyumlu ve değildir 1aksi. (Bu üzerinde kısıtlamayı noktaya bana uzun zaman aldı koşul yalnızca uygulanan kare içermeyen tamsayılar .)

function(n){b=(-n:n)^2
for(i in b^!!b)n=n/i^(!n%%i)
P=1+n%%2
o=outer
!sum(!o(y<-o(8/P*b,2*b,"+")/P-n,z<-16/P*b,"+"),-2*!o(y,4*z,"+"))}

Çevrimiçi deneyin

Getirdiği iyileştirmeler Arnaud ve Giuseppe ile -3 sayesinde (son kod çoğunlukla Giuseppe'nın! Olduğu), Robin

Sözdizimi analizi:

for(i in b[b>0])n=n/i^(!n%%i) #eliminates all square divisors of n
P=2^(n%%2)                    #n odd (2) or even (1)
o=outer                       #saves 3 bytes 
o(8/P*b,2*b,"+")/P-n          #all sums of (8/P)x^2+(2/P)*y^2-n
o(...,16/P*b,"+")             #all sums of above and (16/P)*z^2
o(...,4*z,"+"))               #all sums of above and (64/P)*z^2
!o(...,4*z,"+"))              #all sums of above equal to zero
!sum(!...,2*!...)             #are zeroes twice one another (Tunnell)

Tunnell Teoremi ile , n'nin sadece 2x² + y² + 8z² = n'e tamsayı çözümlerinin sayısı 2'nin nd tekli ise tamsayı çözümlerinin sayısının iki katı olması durumunda ve n'nin tuhaf olduğunu ve 8x² + y² + 16z² = n olan tamsayı çözümlerinin sayısı n ise, 8x² + y² + 64z² = n olan tamsayı çözümlerinin sayısının iki katıdır.


1
PPCG'ye Hoşgeldiniz! Amaç, kodu mümkün olduğunca kısa yapmaktır. Belki golf oynamak için bu ipuçlarına veya bu R'ye özel ipuçlarına bakabilirsiniz .
Giuseppe

1
Çok fazla boşluk var ve Çevrimiçi Deneyin! kodunuzu doğrulamaya yardımcı olmak için :-)
Giuseppe

1
İsterseniz R golfçü sohbetinde de ulaşmaktan çekinmeyin ; kullanarak bildirebilirsiniz @[username]... Robin Ryder tarafından kod golf içine çekti sanırım?
Giuseppe

1
142 bayt - isimsiz fonksiyonlar gayet iyi ve açıklamaktan memnuniyet duyduğum birkaç golf daha yaptım
Giuseppe

1
Güzel! Kullanmanızın bir nedeni var -n:nmı? Tunnel teoremini okumamıştım, ama bana n:0-1 bayt için de işe yarayacak gibi geliyor ... Ayrıca, pro ipucu, TIO'nun üstündeki "link" butonuna basarsanız hoşlanacaksınız PPCG'ye kopyalamak ve yapıştırmak için kullanılan formatlar :-) EDIT: Görüyorum n:0ki çalışmayan bazı durumlar var .
Giuseppe

3

Pas - 282 bayt

fn is(mut n:i64)->bool{let(mut v,p)=(vec![0;4],n as usize%2);while let Some(l)=(2..n).filter(|i|n%(i*i)==0).nth(0){n/=l*l;}for x in -n..=n{for y in -n..=n{for z in -n..=n{for i in 0..2{if n-6*x*x*(n+1)%2==2*x*x+(2-n%2)*(y*y+(24*i as i64+8)*z*z){v[2*p+i]+=1};}}}}v[2*p]==2*v[2*p+1]}
  • Jerrold B. Tunnell'in teoremini kullanın , ki aslında anlamadım ama yine de çalışıyor gibi görünüyor.
  • Tunnell teoreminin sadece gazeteler için tarif edildiği için aşağıdaki makalelerde açıklandığı için n 'i kare serbest' yapmak için tüm kare faktörlerine bölün.
    • Bunun işe yarayacağına inanıyorum, çünkü her eş sayı, bir kare ile çarpıldığında, daha büyük bir eş sayıyı oluşturur ve bunun tersi de geçerlidir. Bu yüzden küçük sayıyı test ederek, bizim durumumuzda n olan daha büyük olanı doğrulayabiliriz. (kaldırılan tüm kareler, büyük bir kare yapmak için birlikte çarpılabilir).
  • olası tüm x, y, z tamsayı kombinasyonları arasında geçiş yapın, Tunnell denklemlerini test edin:
    if n is odd, test if n = 2x2+y2+32z2 and/or 2x2+y2+8z2
    if n is even, test if n = 8x2+2y2+64z2 and/or 8x2+2y2+16z2
    • Kodun kendisinde, dört denklem bir ilmek içine, bir çiftin içine / tekine modül kullanılarak düzgünleştirildi.
  • denklemlerin n ile eşleştiğini hesaplayın
  • Döngü işleminden sonra, oyuncuların oranlarını test et (Tunnell başına)

Ayrıca bakınız:

düzeltilmiş çift / tek, teşekkürler @ Seviye River St


1
oh iyi, o zaman bu çalışmayı aldığımda sadece yanlış olan c ++ cevabını gördüm ...
don parlak

teşekkürler Seviye River St
don

3

C ++ (gcc) , 251 234 bayt

@Arnauld'a, benim açımdan aptalca bir yazım hatası söylediği için teşekkürler.

@Ceilingcat sayesinde -17 bayt.

#import<cmath>
int a(int n){int s=sqrt(n),c,x=-s,y,z,i=1,X;for(;++i<n;)for(;n%(i*i)<1;n/=i*i);for(;x++<s;)for(y=-s;y++<s;)for(z=-s;z++<s;c+=n&1?2*(n==X+24*z*z)-(n==X):2*(n==4*x*x+2*X+48*z*z)-(n/2==2*x*x+X))X=2*x*x+y*y+8*z*z;return!c;}

Çevrimiçi deneyin!

Uygunsa 1 n, aksi takdirde 0 döndürür.

qs2q aynı zamanda uyumludur (algoritma bazı kare içeren sayılar üzerinde kopmuş gibi görünüyor.


1
@Arnauld: ah, bu benim açımdan bir yazım hatası oldu. sabit.
Neil A.,

1

JavaScript (ES7), 165 bayt

Çok gibi Neila. Cevabı @ , bu dayanmaktadır TUNNELL teoremi ve bu nedenle Birch ve Swinnerton-Dyer varsayım doğru olduğunu varsayar.

Bir Boolean değeri döndürür.

n=>(r=(g=i=>i<n?g(i+!(n%i**2?0:n/=i*i)):n**.5|0)(s=2),g=(C,k=r)=>k+r&&g(C,k-1,C(k*k)))(x=>g(y=>g(z=>s+=2*(n==(X=(n&1?2:8)*x+(o=2-n%2)*y)+o*32*z)-(n==X+o*8*z))))|s==2

Çevrimiçi deneyin!

Nasıl?

nnr=ns2

r = (                // we will eventually save isqrt(n) into r
  g = i =>           // g = recursive function taking an integer i
    i < n ?          //   if i is less than n:
      g(i + !(       //     do a recursive call with either i or i + 1
        n % i**2 ?   //     if n is not divisible by i²:
          0          //       yield 0 and therefore increment i
        :            //     else:
          n /= i * i //       divide n by i² and leave i unchanged
      ))             //     end of recursive call
    :                //   else:
      n ** .5 | 0    //     stop recursion and return isqrt(n)
  )(s = 2)           // initial call to g with i = s = 2

gCk2r<kr

  g = (C, k = r) =>  // C = callback function, k = counter initialized to r
    k + r &&         //   if k is not equal to -r:
    g(               //     do a recursive call:
      C,             //       pass the callback function unchanged
      k - 1,         //       decrement k
      C(k * k)       //       invoke the callback function with k²
    )                //     end of recursive call

g(x,y,z)[r+1,r]3s2An=Bnn2Cn=Dnn

An=#{(x,y,z)[r+1,r]3n=2x2+y2+32z2}Bn=#{(x,y,z)[r+1,r]3n=2x2+y2+8z2}Cn=#{(x,y,z)[r+1,r]3n=8x2+2y2+64z2}Dn=#{(x,y,z)[r+1,r]3n=8x2+2y2+16z2}

g(x =>                            // for each x:      \    NB:
  g(y =>                          //   for each y:     >-- all these values are
    g(z =>                        //     for each z:  /    already squared by g
      s +=                        //       add to s:
        2 * (                     //         +2 if:
          n == (                  //           n is equal to either
            X =                   //           An if n is odd (o = 1)
            (n & 1 ? 2 : 8) * x + //           or Cn if n is even (o = 2)
            (o = 2 - n % 2) * y   //
          ) + o * 32 * z          //
        ) - (                     //         -1 if:
          n == X + o * 8 * z      //           n is equal to either
        )                         //           Bn if n is odd
    )                             //           or Dn if n is even
  )                               //
)                                 // if s in unchanged, then n is (assumed to be) congruent

1

Ruby , 126 bayt

->n{[8,32].product(*[(-n..-t=1).map{|i|i*=i;n%i<1&&n/=i;i}*2+[0]]*3).map{|j|d=2-n%2
k,x,y,z=j
2*d*x+y+k*z==n/d&&t+=k-16}
t==1}

Çevrimiçi deneyin!

Ek kopyalar yapmak t=1yerine, kareler listesini başlatmak ve genişletmek için bir üçlü halinde bir yer buldu q.

Ruby , 129 bayt

->n{t=0
[8,32].product(q=(-n..-1).map{|i|i*=i;n%i<1&&n/=i;i}*2+[0],q,q).map{|j|d=2-n%2
k,x,y,z=j
2*d*x+y+k*z==n/d&&t+=k-16}
t==0}

Çevrimiçi deneyin!

Tunnell teoremini diğer cevaplar gibi kullanır. Aşağıdaki gibi tek bir denklem kullanıyorum.

2*d*x^2 + y^2 + k*z^2 == n/d  where d=2 for even n and d=1 for odd n

Davaları kontrol ediyoruz k=8ve ondan k=32iki kat k=8daha fazla çözüm olup olmadığını kontrol ediyoruz k=32. Bu ekleyerek yapılır k-16için tbir çözüm bulmaya her zaman. Bu durumda +16 ya da durumda k=32-8 k=8. Genel tolarak, fonksiyonun sonundaki başlangıç ​​değeriyle aynı olması durumunda sayı eşittir .

Test denklemindeki tüm çözümleri bulmak gerekir. +/- arasında test yapan birçok cevap görüyorum sqrt n. Eğer kodu kısaltırsa, bu sınırların dışında da test etmek tamamen iyidir, ancak denklemin sol tarafı aşacağı için hiçbir çözüm bulunamaz n. Başlangıçta özlediğim şey, negatif ve pozitifin x,y,zayrı olarak düşünülmesidir. Böylece, -3,0,3üç kare elde edilir 9,0,9ve tüm çözümler ayrı ayrı sayılmalıdır (0 bir kez sayılmalı ve 9iki kez sayılmalıdır).

Ungolfed kod

->n{t=0                              #counter for solutions

  q=(-n..-1).map{|i|i*=i;n%i<1&&n/=i #make n square free by dividing by -n^2 to -1^2 as necessary 
  i}*2+[0]                           #return an array of squares, duplicate for 1^2 to n^2, and add the case 0 

  [8,32].product(q,q,q).map{|j|      #make a cartesian product of all possible values for k,x,y,z and iterate
    d=2-n%2                          #d=1 for odd n, 2 for even n
    k,x,y,z=j                        #unpack j. k=8,32. x,y,z are the squared values from q.
    2*d*x+y+k*z==n/d&&t+=k-16}       #test if the current values of k,x,y,z are a valid solution. If so, adjust t by k-16 as explained above.
t==0}                                #return true if t is the same as its initial value. otherwise false.

Olumlu ve olumsuz çözümler hakkında, burada da aynı şekilde, bu noktayı kaçırırken epey zaman kaybettim!
Xi'an,
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.