Có bao nhiêu cách để viết số dưới dạng tổng của hình vuông?


12

Bài tập

Cho hai số nguyên dn, tìm số cách biểu thị ndưới dạng tổng dbình phương. Đó là, n == r_1 ^2 + r_2 ^2 + ... + r_d ^2đó r_mlà một số nguyên cho tất cả các số nguyên 1 ≤ m ≤ d. Lưu ý rằng việc hoán đổi hai giá trị khác nhau (ví dụ r_1r_2) được coi là khác với giải pháp ban đầu.

Chẳng hạn, số 45 có thể được viết dưới dạng tổng của 2 hình vuông 8 cách khác nhau:

45
== (-6)^2 + (-3)^2
== (-6)^2 + 3^2
== (-3)^2 + (-6)^2
== (-3)^2 + 6^2
== 3^2 + (-6)^2
== 3^2 + 6^2
== 6^2 + (-3)^2
== 6^2 + 3^2

Quy tắc

  • Các giải pháp tích hợp được cho phép nhưng không cạnh tranh (ahem, Mathematica )
  • Sơ hở tiêu chuẩn cũng bị cấm.
  • Các đầu vào có thể được đảo ngược.

Ví dụ I / O

In:   d, n

In:   1, 0
Out:  1

In:   1, 2
Out:  0

In:   2, 2
Out:  4

In:   2, 45
Out:  8

In:   3, 17
Out:  48

In:   4, 1000
Out:  3744

In:   5, 404
Out:  71440

In:   11, 20
Out:  7217144

In:   22, 333
Out:  1357996551483704981475000

Đây là , vì vậy các bài nộp sử dụng ít byte nhất sẽ giành chiến thắng!


Tại sao bạn xóa cái này và đăng cái mới trong khi bạn có thể chỉnh sửa bài bạn đã xóa?
Rò rỉ Nun

@LeakyNun Trình duyệt của tôi đã gặp lỗi khi tôi cố chỉnh sửa nó, ngay cả trước khi xóa nó.
JungHwan Min


1
Không, n là 0, không phải d.
Rò rỉ Nun

1
@DeadPossum Đối với 1, 0trường hợp thử nghiệm, có một 1cách để thể hiện 0dưới dạng tổng bình phương 1: 0 == 0^2.
JungHwan Min

Câu trả lời:



5

Mathicala, 8 byte, không cạnh tranh

SquaresR

3
Như thế này thậm chí còn cần thiết ... không thêm bất cứ điều gì mới vào câu hỏi. : P
Erik the Outgolfer

@EriktheOutgolfer Đổ lỗi cho câu hỏi; Nó nói rõ ràng là nó được cho phép.
JollyJoker

Những khoảnh khắc mà các giải pháp không tích hợp gần như đánh bại các giải pháp tích hợp: D
David Mulder

@JollyJoker Quan điểm của tôi là, câu trả lời nên thêm một cái gì đó vào câu hỏi, nếu không thì tại sao lại đăng chúng? * nhún *: P
Erik the Outgolfer

@DavidMulder Lúc đầu tôi đã bỏ lỡ "gần như" và bị sốc một chút ...
Erik the Outgolfer


4

MATL , 13 byte

y_t_&:Z^U!s=s

Đầu vào là n, sau đó d. Một số trường hợp thử nghiệm hết bộ nhớ.

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

Giải trình

Xem xét đầu vào 17, 3.

y     % Implicit inputs. Duplicate from below
      % STACK: 17, 3, 17
_     % Negate
      % STACK: 17, 3, -17
t_    % Duplicate. Negate
      % STACK: 17, 3, -17, 17
&:    % Two-input range
      % STACK: 17, 3, [-17 -16 ... 17]
Z^    % Cartesian power. Gives a matrix where each Cartesian tuple is a row
      % STACK: 17, [-17 -17 -17; -17 -17 -16; ...; 17 17 17]
U     % Square, element-wise
      % STACK: 17, [289 289 289; 289 289 256; ...; 289 289 289]
!s    % Transpose. Sum of each column
      % STACK: 17, [867 834 ... 867]
=     % Equals?, element-wise
      % STACK: 17, [0 0 ... 0] (there are 48 entries equal to 1 in between)
s     % Sum. Implicit display
      % STACK: 48

3

Haskell , 43 byte

0#0=1
d#n=sum[(d-1)#(n-k*k)|d>0,k<-[-n..n]]

Chỉ cần đệ quy cơ bản của bạn. Xác định hàm nhị phân #. Hãy thử trực tuyến!

Giải trình

0#0=1            -- If n == d == 0, give 1.
d#n=             -- Otherwise,
 sum[            -- give the sum of
  (d-1)#(n-k*k)  -- these numbers
  |d>0,          -- where d is positive
   k<-[-n..n]]   -- and k is between -n and n.

Nếu d == 0n /= 0, chúng ta ở trong trường hợp thứ hai và điều kiện d>0làm cho danh sách trống. Tổng của danh sách trống là 0, là đầu ra chính xác trong trường hợp này.



2

05AB1E , 10 byte

Ð(Ÿ²ã€nOQO

Lấy các đối số là n, sau đó d. Có vấn đề giải quyết các trường hợp thử nghiệm lớn hơn.

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

Giải trình

Ð(Ÿ²ã€nOQO   Arguments n, d
Ð            Triplicate n on stack
 (           Negate n
  Ÿ          Range: [-n ... n]
   ²ã        Caertesian product of length d
     €n      Square each number
       OQ    Sum of pair equals n
         O   Total sum (number of ones)


2

Toán học, 38 byte

Count[Tr/@Tuples[Range[-#,#]^2,#2],#]&

Hàm thuần túy lấy các đầu vào theo thứ tự n, d. Range[-#,#]^2đưa ra tập hợp tất cả các ô vuông có thể có liên quan, với các ô vuông dương được liệt kê hai lần để làm cho số đếm chính xác; Tuples[...,#2]tạo ra các dhình vuông của các hình vuông đó; Tr/@tổng hợp từng d-tuple; và Count[...,#]đếm có bao nhiêu kết quả bằng nhau n.

Một vài trường hợp thử nghiệm đầu tiên chấm dứt nhanh chóng, nhưng tôi ước tính việc này sẽ mất khoảng nửa năm để chạy trên trường hợp thử nghiệm 1000,4. Thay thế Range[-#,#]bằng (dài hơn nhưng) hợp lý hơn Range[-Floor@Sqrt@#,Floor@Sqrt@#]sẽ tăng tốc tính toán lên khoảng 13 giây.


1

Toán học, 53 51 byte

SeriesCoefficient[EllipticTheta[3,0,x]^#,{x,0,#2}]&

1

Con trăn 2, 138

Giải pháp rất không hiệu quả với eval yêu quý của tôi. Tại sao không?
Dùng thử trực tuyến

lambda n,d:d and 4*eval(eval("('len({('+'i%s,'*d+'0)'+'for i%s in range(n)'*d+'if '+'i%s**2+'*d+'0==n})')%"+`tuple(range(d)*3)`),locals())

Nó tạo và đánh giá mã như thế này:

len({(i0,i1,0)for i0 in range(n)for i1 in range(n)if i0**2+i1**2+0==n})

Vì vậy, đối với một số d lớn, nó sẽ chạy rất lâu và tiêu tốn rất nhiều bộ nhớ, có độ phức tạp của O (n ^ d)



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.