Ruby, 58 byte
Ini adalah implementasi langsung dari algoritma dalam Melepaskan jawaban C Helium Nuclei .
g=->m,n{n>m ?g[n,m]:m*~m*n*~n/4+n*((2*m-n)*(4*n*n-1)-3)/6}
Saya telah menyelidiki mengapa formula ini bekerja, dengan keberhasilan yang terbatas. Sangat mudah untuk mengkonfirmasi bahwa jumlah persegi panjang tegak sama dengan (m+1)*m/2 * (n+1)*n/2
, jumlah persegi panjang diagonal sedikit lebih sulit dipahami.
Neil punya dikonfirmasi untuk m==n
bahwa jumlah persegi panjang miring dalam n*n
persegi (4*n**4-n*n-3*n)/6
dan bahwa ketika m>n
Anda perlu menambahkan tambahan (m-n)(n*(4*n*n-1)/3)
(terkait dengan Oei A000447 ), meskipun ini tidak menjelaskan di mana dua formula berasal. Saya telah menemukan bagian dari jawabannya.
Sebab m==n
, bentuk di dalam grid adalah berlian Aztec .
Jumlah persegi panjang dalam berlian Aztec adalah jumlah dari jumlah persegi panjang besar ditumpangkan untuk membuatnya (untuk diamond keempat, yang ditemukan dalam 5x5
grid, 2x8
, 4x6
, 6x4
, dan 8x2
) dikurangi jumlah persegi panjang dihitung dua kali (jumlah persegi panjang di berlian Aztec sebelumnya ).
Rumusnya di sini adalah (TeX akan ditambahkan nanti):
# 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)
Menurut Wolfram Alpha, bentuk tertutup untuk f
adalah 1/30*(n-1)*n*(4*n**3+14*n**2+19*n+9)
dan bentuk tertutup aztec_rect
adalah, seperti yang ditemukan Neil 1/6*n*(n-1)*(4*n**2+4*n+3) == 1/6*(4*n**4-n**2-3*n)
,.
Saya belum menemukan alasannya (m-n)(n*(4*n*n-1)/3)
bekerja, meskipun saya curiga itu karena satu definisi A000447 adalah binomial(2*n+1, 3)
. Saya akan membuat Anda tetap diposting.
Memperbarui: Saya punya alasan untuk percaya bahwa fungsi jumlah persegi panjang pada berlian Aztec yang diperluas m>n
terkait dengan jumlah 2k*2(n-k)
persegi panjang yang dilapiskan pada minus berlian F(m-1,n-1)
. Lebih banyak hasil ketika saya memilikinya.
Pembaruan: Saya mencoba rute yang berbeda dan berakhir dengan formula lain untuk berlian Aztec tambahan yang sebagian besar dapat dijelaskan tetapi memiliki satu istilah yang belum saya mengerti. Sabas! : 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)
Rincian cepat dari formula terakhir itu:
(m-n+1)*(4*n**4-n*n-3*n)/6
adalah jumlah berlian Aztec ditumpangkan ukuran n
dalam struktur, seperti f(n,n) = (4*n**4-n*n-3*n)/6
. f(7,3)
memiliki 5 ukuran berlian Aztec3
, sementara f(3,3)
hanya memiliki 1 berlian.
-f(m-1,n-1)
menghapus beberapa duplikat persegi panjang dari tengah berlian yang dilapiskan.
+(m-n)*2
menyumbang 2 ekstra- 2
oleh-(2n-1)
persegi panjang untuk setiap berlian ekstra.
+(m-n)*(n-2)
menyumbang tambahan n
-by- n
persegi untuk setiap berlian ekstra.
-(m-n-1)*f(n-1,n-1)
Ini adalah istilah baru yang membingungkan. Tampaknya saya belum menghitung beberapa kotak tambahan dalam penghitungan saya, tapi saya belum menemukan di mana mereka berada di berlian diperpanjang.
Catatan: kapan m==n
,, m-n-1 = -1
artinya istilah terakhir ini menambahkan kotak ke penghitungan. Saya mungkin kehilangan sesuatu dalam formula biasa saya. Pengungkapan penuh, ini hanya dimaksudkan sebagai tambalan untuk rancangan awal formula ini yang baru saja berfungsi. Jelas, saya masih perlu menggali apa yang terjadi, dan mungkin formula saya mengandung beberapa bug di dalamnya. Saya akan membuat Anda diposting.
Russell, Gary dan Weisstein, Eric W. "Aztec Diamond." Dari MathWorld - Sumber Daya Web Wolfram. http://mathworld.wolfram.com/AztecDiamond.html