Ruby, 58 byte
Đây là một triển khai đơn giản của thuật toán trong việc phát hành câu trả lời C của Helium Nuclei's .
g=->m,n{n>m ?g[n,m]:m*~m*n*~n/4+n*((2*m-n)*(4*n*n-1)-3)/6}
Tôi đã nghiên cứu lý do tại sao công thức này hoạt động, với sự thành công hạn chế. Thật dễ dàng để xác nhận rằng số lượng hình chữ nhật thẳng đứng bằng (m+1)*m/2 * (n+1)*n/2
, số lượng hình chữ nhật chéo là khó nắm bắt hơn một chút.
Neil đã khẳng định cho m==n
rằng số lượng hình chữ nhật nghiêng trong một n*n
vuông là (4*n**4-n*n-3*n)/6
và khi m>n
bạn cần phải bổ sung thêm một (m-n)(n*(4*n*n-1)/3)
(liên quan đến OEIS A000447 ), mặc dù điều này không giải thích nơi hai công thức đến từ đâu. Tôi đã tìm thấy một phần của câu trả lời.
Đối với m==n
, hình dạng bên trong lưới là một viên kim cương Aztec .
Số lượng các hình chữ nhật trong một viên kim cương Aztec là tổng số các hình chữ nhật lớn chồng lên để làm cho nó (đối với kim cương thứ tư, được tìm thấy trong một 5x5
lưới, 2x8
, 4x6
, 6x4
, và 8x2
) trừ đi số của hình chữ nhật tính hai lần (số lượng hình chữ nhật trong viên kim cương Aztec trước đó ).
Công thức ở đây là (TeX sẽ được thêm vào sau):
# superimposed rectangles, 2x(2n-2), 4*(2n-4), ...
f = lambda n: sum( (2*k)*(2*k+1)/2 * (2*n-2*k)*(2*n-2*k+1)/2 for k in range(1, n) )
aztec_rect = f(n) - f(n-1)
Theo Wolfram Alpha, hình thức khép kín cho f
là 1/30*(n-1)*n*(4*n**3+14*n**2+19*n+9)
và hình thức khép kín cho aztec_rect
là, như Neil phát hiện, 1/6*n*(n-1)*(4*n**2+4*n+3) == 1/6*(4*n**4-n**2-3*n)
.
Tôi vẫn chưa khám phá lý do tại sao (m-n)(n*(4*n*n-1)/3)
hoạt động, mặc dù tôi nghi ngờ rằng đó là vì một định nghĩa của A000447 là binomial(2*n+1, 3)
. Tôi sẽ giữ cho bạn được đăng.
Cập nhật: Tôi có lý do để tin rằng chức năng của số lượng hình chữ nhật trong một viên kim cương Aztec mở rộng m>n
có liên quan đến số lượng 2k*2(n-k)
hình chữ nhật chồng lên nhau trong dấu trừ kim cương F(m-1,n-1)
. Kết quả nhiều hơn khi tôi có chúng.
Cập nhật: Tôi đã thử một tuyến đường khác và kết thúc với một công thức khác cho kim cương Aztec mở rộng hầu hết có thể giải thích được nhưng có một thuật ngữ mà tôi chưa hiểu. Huzzah! : D
def f(m,n):
if n > m:
return f(n,m)
if n == 0:
return 0
else:
return(m-n+1)*(4*n**4-n*n-3*n)/6-f(m-1,n-1)+(m-n)*2+(m-n)*(n-2)-(m-n-1)*f(n-1,n-1)
Phân tích nhanh công thức cuối cùng đó:
(m-n+1)*(4*n**4-n*n-3*n)/6
là số lượng kim cương Aztec xếp chồng có kích thước n
trong cấu trúc, như f(n,n) = (4*n**4-n*n-3*n)/6
. f(7,3)
có 5 viên kim cương Aztec xếp chồng lên nhau 3
, trong khi f(3,3)
chỉ có 1 viên kim cương.
-f(m-1,n-1)
loại bỏ một số hình chữ nhật trùng lặp ở giữa các viên kim cương chồng lên nhau.
+(m-n)*2
chiếm 2 thêm 2
-by- (2n-1)
hình chữ nhật cho mỗi viên kim cương thêm.
+(m-n)*(n-2)
chiếm một hình vuông n
ngoại cỡ n
cho mỗi viên kim cương phụ.
-(m-n-1)*f(n-1,n-1)
Đây là thuật ngữ khó hiểu mới. Rõ ràng tôi đã không tính đến một số hình vuông phụ trong số đếm của mình, nhưng tôi đã không tìm ra vị trí của chúng trong viên kim cương mở rộng.
Lưu ý: khi m==n
,, m-n-1 = -1
có nghĩa là thuật ngữ cuối cùng này thêm hình vuông vào số đếm. Tôi có thể thiếu một cái gì đó trong công thức thông thường của tôi. Tiết lộ đầy đủ, điều này chỉ có nghĩa là một bản vá cho một dự thảo trước đó của công thức này vừa xảy ra để làm việc. Rõ ràng, tôi vẫn cần phải tìm hiểu những gì đang diễn ra, và có thể là công thức của tôi có một số lỗi trong đó. Tôi sẽ giữ cho bạn được đăng.
Russell, Gary và Weisstein, Eric W. "Kim cương Aztec." Từ MathWorld - Tài nguyên web Wolfram. http://mathworld.wolfram.com/AztecDihua.html