Số đồng dư


21

Định nghĩa:

  • Một tam giác được coi là một tam giác vuông nếu một trong các góc bên trong chính xác là 90 độ.
  • Một số được coi là hợp lý nếu nó có thể được biểu diễn bằng tỷ lệ số nguyên, nghĩa là p/q, trong đó cả hai pqlà số nguyên.
  • Một số nlà một số đồng dạng nếu tồn tại một tam giác vuông có diện tích ntrong đó cả ba cạnh là hợp lý.
  • Đây là OEIS A003273 .

Thử thách

Đây là một thách thức . Cho một số đầu vào x, xuất ra một giá trị riêng biệt và nhất quán nếu xlà một số đồng dạng và một giá trị riêng biệt và nhất quán riêng biệt nếu xkhông phải là một số đồng dạng. Các giá trị đầu ra không nhất thiết phải là trung thực / falsey trong ngôn ngữ của bạn.

Quy tắc đặc biệt

Đối với mục đích của thử thách này, bạn có thể cho rằng phỏng đoán của Birch và Swinnerton-Dyer là đúng. Ngoài ra, nếu bạn có thể chứng minh phỏng đoán của Birch và Swinnerton-Dyer, hãy yêu cầu nhận giải thưởng Thiên niên kỷ trị giá 1.000.000 đô la của bạn. ;-)

Ví dụ

(Sử dụng Truecho số đồng dạng và Falsekhác).

5 True
6 True
108 False

Quy tắc và làm rõ

  • Đầu vào và đầu ra có thể được đưa ra bởi bất kỳ phương pháp thuận tiện .
  • Bạn có thể in kết quả sang STDOUT hoặc trả lại dưới dạng kết quả hàm. Vui lòng nêu trong bài nộp của bạn những giá trị mà đầu ra có thể mất.
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận.
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là để áp dụng tất cả các quy tắc chơi golf thông thường và mã ngắn nhất (tính bằng byte) sẽ thắng.

3
Là đầu vào một số nguyên dương?
Lynn

Cách tiếp cận ban đầu của tôi là nhân số đầu vào với một số vuông tùy ý cho đến khi nó bằng một nửa sản phẩm của hai chân trong bộ ba Pythagore, nhưng sau đó tôi nhận ra rằng có thể hơi khó để thực sự chấm dứt cho đầu vào không đồng nhất.
Chuỗi không liên quan

@ Xi'an Được rồi, nhưng những thách thức nên được khép kín.
Lynn

@Lynn Có, đầu vào sẽ là một số nguyên dương.
admBorkBork

Câu trả lời:


8

R, 179 173 142 141 137 135 134 byte

Sử dụng các đối số tương tự dựa trên Định lý Tunnell , trả về một 0nếu nkhông phù hợp và 1ngược lại. (Phải mất một thời gian dài tôi mới phát hiện ra ràng buộc về điều kiện chỉ áp dụng cho các số nguyên không bình phương .)

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,"+"))}

Dùng thử trực tuyến

Những cải tiến do ArnaudGiuseppe mang lại (mã cuối cùng chủ yếu là của Guiseppe!), Với -3 nhờ Robin

Phân tích cú pháp:

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)

với Định lý của Tunnell nói rằng n đồng dạng khi và chỉ khi số lượng các giải pháp số nguyên là 2x² + y² + 8z² = n nhiều gấp đôi số lượng các giải pháp số nguyên cho 2x² + y² + 32z² = n nếu n là số lẻ và số của các giải pháp số nguyên cho 8x² + y² + 16z² = n nhiều gấp đôi số lượng các giải pháp số nguyên cho 8x² + y² + 64z² = n nếu n chẵn.


1
Chào mừng đến với PPCG! Mục tiêu là làm cho mã càng ngắn càng tốt. Có lẽ bạn có thể xem những lời khuyên này để chơi gôn hoặc những lời khuyên dành riêng cho R này .
Giuseppe

1
Có rất nhiều khoảng trắng và tôi cũng khuyên bạn nên bao gồm một liên kết đến Dùng thử trực tuyến! để giúp xác minh mã của bạn :-)
Giuseppe

1
Hãy thoải mái tiếp cận trong trò chuyện của người chơi golf R nếu bạn muốn; bạn có thể thông báo bằng cách sử dụng @[username]... Tôi đoán bạn đã bị Robin Ryder lôi vào mã golf ??
Giuseppe

1
142 byte - các chức năng ẩn danh là hoàn toàn tốt, và tôi đã tạo ra một vài sân golf khác mà tôi rất vui để giải thích
Giuseppe

1
Tốt đẹp! Có một lý do bạn sử dụng -n:n? Tôi đã không đọc định lý của Đường hầm, nhưng dường như với tôi nó n:0cũng hoạt động tốt với -1 byte ... Ngoài ra, mẹo chuyên nghiệp, nếu bạn nhấn nút "liên kết" trên đầu TIO, bạn sẽ thấy rất tuyệt các định dạng để sao chép và dán vào PPCG :-) EDIT: Tôi thấy, có một số trường hợp n:0không hoạt động.
Giuseppe

3

Rust - 282 byte

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]}
  • Sử dụng định lý của Jerrold B. Tunnell , điều mà tôi không thực sự hiểu, nhưng dường như vẫn hoạt động.
  • chia n cho tất cả các yếu tố hình vuông của nó, để làm cho nó 'vuông tự do', vì trong các bài viết dưới định lý của Tunnell chỉ được mô tả cho giải phóng hình vuông.
    • Tôi tin rằng điều này có thể hoạt động bởi vì mọi số đồng dạng, khi được nhân với một hình vuông, sẽ tạo ra một số đồng dư lớn hơn và ngược lại. vì vậy bằng cách kiểm tra số nhỏ hơn, chúng ta có thể xác nhận số lớn hơn, trong trường hợp của chúng ta là n. (tất cả các hình vuông bị loại bỏ, có thể được nhân với nhau để tạo thành một hình vuông lớn).
  • lặp qua tất cả các kết hợp có thể có của các số nguyên x, y, z, kiểm tra phương trình của Tunnell:
    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
    • trong chính mã, bốn phương trình đã được chuyển thành một, bên trong một vòng lặp, sử dụng modulo cho chẵn / lẻ
  • giữ một số đếm trong đó phương trình khớp với n
  • sau khi lặp, kiểm tra tỷ lệ của các nàng tiên (theo Tunnell)

Xem thêm:

đã sửa chẵn / lẻ, cảm ơn @Level River St


1
ồ, tại thời điểm tôi làm việc này, tôi chỉ thấy câu trả lời c ++ đã sai ...
don sáng

cảm ơn Level River St
don sáng

3

C ++ (gcc) , 251 234 byte

Cảm ơn @arnauld vì đã chỉ ra một lỗi đánh máy ngớ ngẩn từ phía tôi.

-17 byte nhờ @ceilingcat.

#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;}

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

Trả về 1 nếu nđồng dạng, 0 nếu không.

Cho rằng chúng ta có thể giả định rằng phỏng đoán của Birch và Swinnerton-Dyer là đúng, tôi đã sử dụng Định lý của Đường hầm như một bài kiểm tra. Lưu ý rằng về mặt kỹ thuật chỉ cần kiểm tra các giá trị khác không x, y và z, vì một tập hợp dương (x, y, z) ngụ ý nhiều tập hợp hơn khi mỗi số đó là âm, vì bốn số được xác định sử dụng bình phương của x, y và z trong tính toán của họ. Ngoài ra, do chỉ có tỷ lệ của hai số A và B hoặc C và D là mong muốn, chúng tôi thậm chí không cần lo lắng về các bộ khác này. Do đó, chúng ta chỉ cần thêm 2 cho mọi giải pháp cho A hoặc C và trừ 1 cho mọi giải pháp của B hoặc D, và kiểm tra xem chúng ta có kết thúc bằng 0. Ngoài ra, đầu vào được giảm xuống một số nguyên không vuông, bởi vì nếu là một số đồng dư thìqs2q cũng đồng dạng (thuật toán dường như phá vỡ trên một số số có chứa hình vuông.


1
@Arnauld: ah, đó là một lỗi đánh máy từ phía tôi. đã sửa.
Neil A.

1

JavaScript (ES7), 165 byte

Giống như câu trả lời của @ NeilA. , điều này dựa trên định lý của Tunnell và do đó giả định rằng phỏng đoán của Birch và Swinnerton-Dyer là đúng.

Trả về giá trị Boolean.

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

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

Làm sao?

Trước tiên, chúng tôi chuyển đổi đầu vào thành đối tác không vuông góc , tính và khởi tạo thành .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

Sau đó, chúng tôi xác định hàm trợ giúp gọi hàm gọi lại với cho .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

Cuối cùng chúng tôi sử dụng 3 lệnh gọi lồng nhau để đi qua tất cả các bộ ba và cập nhật để kiểm tra xem nếu là số lẻ hay nếu là chẵn, với: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 byte

->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}

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

tìm thấy một nơi để khởi tạo t=1và mở rộng danh sách các ô vuông thành một bộ ba thay vì sử dụng qđể tạo các bản sao bổ sung.

Ruby , 129 byte

->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}

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

Sử dụng định lý Tunnell giống như các câu trả lời khác. Tôi sử dụng một phương trình duy nhất như sau.

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

Chúng tôi kiểm tra các trường hợp k=8k=32kiểm tra xem có nhiều giải pháp k=8hơn gấp đôi không k=32. Điều này được thực hiện bằng cách thêm k-16vào tmỗi khi chúng tôi tìm ra giải pháp. Đây là +16 trong trường hợp k=32hoặc -8 trong trường hợp k=8. Nhìn chung, số này đồng dạng nếu tgiống với giá trị ban đầu của nó ở cuối hàm.

Cần phải tìm tất cả các giải pháp cho phương trình thử nghiệm. Tôi thấy nhiều câu trả lời kiểm tra giữa +/- sqrt n. Hoàn toàn ổn khi kiểm tra ngoài các giới hạn này nếu nó làm cho mã ngắn hơn, nhưng không có giải pháp nào được tìm thấy vì phía bên trái của phương trình sẽ vượt quá n. Điều tôi đã bỏ lỡ lúc đầu là tiêu cực và tích cực x,y,zđược xem xét riêng. Do đó -3,0,3mang lại ba hình vuông 9,0,9và tất cả các giải pháp phải được tính riêng (0 phải được tính một lần và 9phải được tính hai lần.)

Mã bị đánh cắp

->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.

về các giải pháp tích cực và tiêu cực, tương tự ở đây, tôi đã lãng phí khá nhiều thời gian thiếu điểm này!
Tây An
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.