Это древнее знание, что каждое неотрицательное целое число может быть переписано как сумма четырех квадратов целых чисел. Например, число 1 может быть выражено как . Или, вообще, для любого неотрицательного целого числа существуют целые числа такие что
Джозеф-Луи Лагранж доказал это в 1700-х годах, и поэтому его часто называют теоремой Лагранжа .
Это иногда обсуждается в связи с кватернионами - типом чисел, обнаруженным Уильямом Гамильтоном в 1800-х годах, представленном как
Рудольф Липшиц изучал кватернионы только с целочисленными компонентами, называемыми липшицевыми кватернионами. Используя квадрант, мы можем представить, что у каждого липшицевого кватерниона можно найти друга в целых числах. Например, кватернион можно рассматривать как связанный с целым числом . Кроме того, если мы пойдем назад, то каждое целое число можно будет считать имеющим друга в квантионах Липшица.
Но есть интересная деталь в теореме Лагранжа - суммирование не уникально. Каждое целое число может иметь несколько различных наборов из четырех квадратов, которые можно суммировать для его создания. Например, число 1 можно выразить четырьмя способами, используя неотрицательные целые числа (давайте рассмотрим только неотрицательные для этой задачи):
Слагаемые всегда являются квадратами 0 или 1, но они могут находиться в разных позициях в выражении.
Для этой задачи давайте также «отсортируем» наши слагаемые по убыванию, чтобы исключить дубликаты, чтобы в этом упражнении можно было учесть, что 1 имеет только один способ представления в виде суммы четырех квадратов:
Другим примером является число 42, которое может быть выражено четырьмя способами (опять же, только учитывая неотрицательные a, b, c, d и устраняя дублирующиеся расположения компонентов)
Что если мы представим каждый из этих различных способов выражения целого числа как связанный с определенным кватернионом? Тогда мы могли бы сказать, что число 42 связано с этими четырьмя кватернионами:
If we imagine the standard computer graphics interpretation of a quaternion, where , and are vectors in three dimensional Euclidean space, and so the , and components of the quaternion are 3 dimensional Cartesian coordinates, then we can imagine that each integer, through this thought process, can be associated with a set of 3 dimensional coordinates in space. For example, the number 42 is associated with the following four coordinates:
Это можно рассматривать как облако точек или набор точек в пространстве. Теперь, одна интересная вещь о наборе конечных точек в пространстве - это то, что вы всегда можете нарисовать вокруг них минимальную ограничивающую рамку - коробку, которая достаточно велика, чтобы вместить все точки, но не больше. Если вы представляете, что это обычное поле, выровненное по осям , оно называется ограничивающим прямоугольником, выровненным по оси . Ограничительная рамка также имеет объем, который вычисляется путем определения его ширины, длины и высоты и умножения их вместе.
Затем мы можем представить объем ограничивающего прямоугольника для точек, образованных нашими кватернионами. Для целого числа 1 мы используем, используя критерии этого упражнения, один кватернион, чей квадрант равен 1, . Это очень простое облако точек, оно имеет только одну точку, поэтому его ограничивающий прямоугольник имеет объем 0. Однако для целого числа 42 у нас есть четыре кватерниона и четыре точки, вокруг которых мы можем нарисовать ограничивающий прямоугольник. Минимальная точка поля - а максимальная - resulting in a width, length, and height of 2, 2, and 2, giving a volume of 8.
Let's say that for an integer , the qvolume is the volume of the axis-aligned bounding box of all the 3D points formed by quaternions that have a quadrance equal to , where the components of the quaternion are non-negative and .
Create a program or function that, given a single non-negative integer , will output 's qvolume.
Examples:
input -> output
0 -> 0
1 -> 0
31 -> 4
32 -> 0
42 -> 8
137 -> 96
1729 -> 10032
This is code-golf, smallest number of bytes wins.
источник
Ответы:
Wolfram Language (Mathematica),
6758 bytesTry it online!
источник
Jelly, 17 bytes
Try it online! (pretty slow - make it fast enough for all the test cases with a leading
½
)How?
источник
Haskell,
132123 bytesTry it online!
Pretty straightforward solution. Brute force all the possible solutions by iterating over all the values from 0 to n (way overkill but shorter bytecount). I output the point as a list so we can use @Lynn's magic
(!)
operator. That operator collapses each dimension with the function on the left side somax!p
returns a list of size 3 which consists of the maximums along each dimension andmin!p
does the same for minimum. Then we just find the minimum size in each dimension (by subtracting the min value from the max withz(-)
) and multiply them together.Thanks a lot to @Lynn for taking off 9 bytes with some folding zip magic!
источник
zipWith
логики. 123 байтаКувалда 0,2, 12 байт
Используйте с Mathematica 11.2 и этой версией Sledgehammer, которая предшествует вызову. Смотрите историю изменений для версии, которая работает в версии 0.3, которая имеет графический интерфейс и генерирует выражение Mathematica.
Это помещает ввод в стек и вызывает последовательность команд
что эквивалентно оценке следующего кода Wolfram, полученного из моего ответа на языке Wolfram Language :
Попробуйте онлайн!
источник
Python 2 , 138 байт
Попробуйте онлайн!
Рекурсивно генерирует обратно отсортированные кватернионы с заданной нормой, а затем принимает произведение между максимальным и минимальным значениями всех возможных значений в первых трех индексах.
itertools
возможно, был бы выстрел, если бы он не использовал смехотворно длинные имена, такие какitertools.combinations_with_replacement
Python 2 , 161 байт
Попробуйте онлайн!
Вот почему
itertools
никогда не ответ .источник
JavaScript (ES6),
148143 байтаПопробуйте онлайн!
комментарии
Инициализируем массивр с 3 пустыми массивами.
Для каждого действительного значенияИкс мы установим 1 значение в х + 1 в первом массиве. То же самое дляY а также Z со вторым и третьим массивами соответственно.
Размеры ограничительной рамки будут выведены из расстояния между первой и последней записью, установленной на1 в этих массивах.
Шаг 1
Заполнитьр мы используем рекурсивную функцию г ,
Шаг 2
Теперь мы можем вычислить продуктп размеров.
источник
C # (интерактивный компилятор Visual C #) , 229 байт
Попробуйте онлайн!
источник
05AB1E , 18 байт
Попробуйте онлайн!
Порт Джонатана Аллана желе ответ .
источник
Haskell , 108 байт
Попробуйте онлайн! (время ожидания для более крупных тестовых случаев)
Здесь есть несколько странных оптимизаций. Чтобы вычислить
maximum l-minimum l
для спискаl
элементов в данной позиции, оказывается более коротким в контексте, чтобы преобразовать их оба в максимумы, отрицая второй член:,maximum l+maximum(map((-1)*))l
или эквивалентноsum[maximum$map(b*)l||b<-[-1,1]]
.Чтобы умножить эти три измерения, просто написать продукт проще,
f n=n%0*n%1*n%2
чем использовать любой цикл. Здесьn%i
разница между минимальным и максимальнымi
значениями координат, которые извлекаются при индексировании!!i
.Чтобы сгенерировать действительные четыре кортежа, мы берем списки из четырех чисел,
[0..n]
чьи квадраты суммируютсяn
и находятся в порядке убывания. Мы проверяем обратную сортировкуt
с помощьюscanr1 max t==t
, которая определяет, является ли рабочий максимум обратного сам по себе, поскольку в Haskell нет встроенной сортировки без дорогостоящего импорта. Я пытался рекурсивно генерировать четыре кортежа, как в моих ответах на Python, но все они были длиннее, чем этот метод генерации и фильтрации методом грубой силы.источник