Рубин, 58 байт
Это простая реализация алгоритма в выпуске 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}
Я изучал, почему эта формула работает, с ограниченным успехом. Нетрудно подтвердить, что количество вертикальных прямоугольников равно (m+1)*m/2 * (n+1)*n/2
, а количество диагональных прямоугольников немного неуловимо.
Нил подтвердил для m==n
что количество наклонных прямоугольников в n*n
квадрате , (4*n**4-n*n-3*n)/6
и что , когда m>n
вам нужно добавить дополнительный (m-n)(n*(4*n*n-1)/3)
(связанный с OEIS A000447 ), хотя это не объясняет , где эти две формулы пришли. Я нашел часть ответа.
Для m==n
формы внутри сетки является Aztec алмаза .
Количество прямоугольников в ацтекском алмазе является сумма ряда крупных прямоугольников накладывается , чтобы сделать это (за четвертый алмаз, который находится в 5x5
сетке 2x8
, 4x6
, 6x4
и 8x2
) минус число прямоугольников посчитано дважды (число прямоугольники в предыдущем ацтекском алмазе).
Формула здесь (TeX будет добавлен позже):
# 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)
Согласно Вольфраму Альфе, закрытая форма для f
is 1/30*(n-1)*n*(4*n**3+14*n**2+19*n+9)
и закрытая форма для aztec_rect
is, как обнаружил Нейл 1/6*n*(n-1)*(4*n**2+4*n+3) == 1/6*(4*n**4-n**2-3*n)
.
Мне еще предстоит выяснить, почему (m-n)(n*(4*n*n-1)/3)
работает, хотя я подозреваю, что это потому, что одно определение A000447 является binomial(2*n+1, 3)
. Я буду держать вас в курсе.
Обновление: у меня есть основания полагать, что функция количества прямоугольников в расширенном ацтекском алмазе m>n
связана с количеством наложенных 2k*2(n-k)
прямоугольников в минусе F(m-1,n-1)
. Больше результатов, когда они у меня есть.
Обновление: я пробовал другой маршрут и в итоге получил другую формулу для расширенных ацтекских алмазов, которая в основном объяснима, но имеет один термин, который я еще не понимаю. Ура! : 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)
Краткое описание этой последней формулы:
(m-n+1)*(4*n**4-n*n-3*n)/6
количество наложенных ацтекских алмазов размера n
в структуре, а f(n,n) = (4*n**4-n*n-3*n)/6
. f(7,3)
имеет 5 наложенных ацтекских бриллиантов размером 3
, в то время как f(3,3)
имеет только 1 бриллиант.
-f(m-1,n-1)
удаляет некоторые повторяющиеся прямоугольники из середины наложенных алмазов.
+(m-n)*2
составляет 2 дополнительных 2
матрицу с размерностью (2n-1)
прямоугольников для каждого дополнительного бриллианта.
+(m-n)*(n-2)
счета за дополнительную n
матрицу с размерностью n
квадрата для каждого дополнительного бриллианта.
-(m-n-1)*f(n-1,n-1)
Это новый загадочный термин. Очевидно, я не учел некоторые дополнительные квадраты в моем подсчете, но я не выяснил, где они находятся в расширенном алмазе.
Примечание: когда m==n
, m-n-1 = -1
означает, что последний член добавляет квадраты к счету. Я мог бы что-то упустить в моей обычной формуле. Полное раскрытие, это было предназначено только для исправления более ранней версии этой формулы, которая только что сработала. Очевидно, мне все еще нужно разобраться в том, что происходит, и, возможно, в моей формуле есть некоторые ошибки. Я буду держать вас в курсе.
Рассел, Гэри и Вайстейн, Эрик У. "Ацтек Алмаз". Из MathWorld - веб-ресурс Wolfram. http://mathworld.wolfram.com/AztecDiamond.html