Ruby, 58 bytes
Esta é uma implementação direta do algoritmo na resposta C de liberação dos núcleos de hélio .
g=->m,n{n>m ?g[n,m]:m*~m*n*~n/4+n*((2*m-n)*(4*n*n-1)-3)/6}
Tenho investigado por que essa fórmula funciona, com sucesso limitado. É fácil confirmar que o número de retângulos na vertical é igual a (m+1)*m/2 * (n+1)*n/2
, o número de retângulos na diagonal é um pouco mais ilusório.
Neil foi confirmada para m==n
que o número de retângulos inclinados em uma n*n
praça é (4*n**4-n*n-3*n)/6
e que quando m>n
você precisa adicionar um adicional (m-n)(n*(4*n*n-1)/3)
(relacionada com OEIS A000447 ), embora isso não explica onde essas duas fórmulas veio. Eu encontrei parte da resposta.
Pois m==n
, a forma dentro da grade é um diamante asteca .
O número de rectângulos em um diamante asteca é a soma do número de grandes rectângulos sobrepostos para torná-la (para o quarto de diamante, que se encontra em uma 5x5
grade, 2x8
, 4x6
, 6x4
, e 8x2
) menos o número dos rectângulos contado duas vezes (o número de retângulos no diamante asteca anterior ).
A fórmula aqui é (TeX a ser adicionado posteriormente):
# 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)
De acordo com Wolfram Alpha, a forma fechada para f
é 1/30*(n-1)*n*(4*n**3+14*n**2+19*n+9)
e a forma fechada para aztec_rect
é, como Neil descobriu 1/6*n*(n-1)*(4*n**2+4*n+3) == 1/6*(4*n**4-n**2-3*n)
,.
Ainda estou para descobrir por que (m-n)(n*(4*n*n-1)/3)
funciona, embora eu suspeite que seja porque uma definição de A000447 é binomial(2*n+1, 3)
. Vou mantê-lo informado.
Atualização: Tenho motivos para acreditar que a função do número de retângulos em um diamante asteca estendido m>n
está relacionada ao número de 2k*2(n-k)
retângulos sobrepostos no diamante menos F(m-1,n-1)
. Mais resultados quando eu os tiver.
Atualização: Tentei uma rota diferente e acabei com outra fórmula para os diamantes astecas estendidos que são explicáveis principalmente, mas que têm um termo que ainda não entendi. 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)
Um rápido resumo dessa última fórmula:
(m-n+1)*(4*n**4-n*n-3*n)/6
é o número de diamantes astecas sobrepostos de tamanho n
na estrutura, como f(n,n) = (4*n**4-n*n-3*n)/6
. f(7,3)
tem 5 diamantes astecas sobrepostos 3
, enquanto f(3,3)
tem apenas 1 diamante.
-f(m-1,n-1)
remove alguns retângulos duplicados do meio dos diamantes sobrepostos.
+(m-n)*2
responde por 2 extra 2
-by- (2n-1)
retângulos para cada diamante extra.
+(m-n)*(n-2)
representa um extra n
-by- n
quadrado para cada diamante extra.
-(m-n-1)*f(n-1,n-1)
Este é o novo termo intrigante. Aparentemente, eu não contei alguns quadrados extras na minha contagem, mas ainda não descobri onde eles estão no diamante estendido.
Nota: quando m==n
, m-n-1 = -1
significa que este último termo adiciona quadrados à contagem. Eu posso estar perdendo alguma coisa na minha fórmula regular. Divulgação completa, isso só deveria ser um patch para um rascunho anterior dessa fórmula que funcionava. Claramente, ainda preciso me aprofundar no que está acontecendo, e pode ser que minha fórmula tenha alguns bugs. Vou mantê-lo informado.
Russell, Gary e Weisstein, Eric W. "Aztec Diamond". De MathWorld - um recurso da Web da Wolfram. http://mathworld.wolfram.com/AztecDiamond.html