- 22, Oct 2024
- #1
Введение
Если в комнате голые параллельные стены, это может создавать неприятные повторяющиеся акустические отражения (эхо). Диффузор — это устройство, установленное на стене, которое создает блочную поверхность разной высоты. Это приводит к разбиению отраженного звука на множество более мелких отражений (каждое с разной временной задержкой). Считается, что акустическое качество помещения значительно улучшается.
Примитивный корневой диффузор
В примитивном корневом диффузоре используется сетка из столбиков (обычно деревянных), каждая из которых имеет разную высоту (чтобы получить разное время задержки отражения). Высоты столбов выбираются в соответствии с последовательными степенями первородного корня G по модулю N (простое число).
Здесь Несколько фотографий примитивного корневого диффузора.
Задача
Вы должны написать программу или функцию, которая принимает простое число N > 2 в качестве единственного входного параметра. Затем он должен выбрать примитивный корень из N. G является примитивным корнем из N, если последовательные степени G по модулю N генерируют все целые числа от 1 до N-1. Более формальное определение примитивных корней можно найти в Статья в Википедии.
Затем ваш код должен поместить эти последовательные степени в массив (или матрицу) X на Y. Поскольку мы хотим повесить его на стену, диффузор должен быть удобной формы — как можно ближе к квадратной. Количество записей в массиве будет N-1, поэтому его размеры X и Y следует выбирать так, чтобы X*Y = N-1, а X был близок к Y, но не равен ему (в частности, X и Y взаимно просты). . Для удобства отображения горизонтальный размер должен быть больше вертикального.
Порядок размещения последовательных степеней G (по модулю N) должен начинаться с одного угла массива, затем проходить по диагонали через массив, повторяясь в обоих направлениях, пока все позиции массива не будут заполнены. Затем функция должна вернуть этот массив или вывести его на стандартный вывод, в зависимости от того, что вы предпочитаете.
Мы не будем интересоваться единицами измерения, используемыми для обрезки столбов по длине; мы предположим, что единицы измерения подходят для диапазона звуковых частот, которые мы хотим рассеивать, и будем придерживаться целых чисел.
Есть онлайн-калькулятор, на случай, если вы захотите проверить свою работу. Однако в настоящее время сайт, похоже, недоступен.
Пример
Предположим, мы выбрали N = 41. Наша программа должна выбрать один из примитивных корней числа N, а именно [6, 7, 11, 12, 13, 15, 17, 19, 22, 24, 26, 28, 29, 30, 34, 35]. Предположим, наша программа выбирает наименьший примитивный корень G = 6.
Затем наша программа выбирает квадратные размеры X,Y для массива так, что X*Y = N-1. Очевидный выбор — X=8 и Y=5.
Затем наша программа заполняет массив последовательными степенями G по модулю N (начиная с G^0), перемещаясь по диагонали. Затем программа возвращает/печатает массив:
1 12 33 26 16 7 10 9 34 31 2 24 29 15 32 14 20 18 36 25 4 11 21 30 27 28 3 6 35 13 8 22 5 23 17 19
Обратите внимание, что оно начинается с 6^0 по модулю 41 = 1, затем 6^1 по модулю 41 = 6, затем 6^2 по модулю 41 = 36, затем 6^3 по модулю 41 = 11 и т. д.
Чтобы уточнить, последовательность степеней 6 по модулю 41 такова:
1 26 25 30 5 6
4 11 7 27 20 24
16 13 28 15 18 3
2 21 19 29 10 12
8 22 14 23 9 17
Другой пример
Н = 31
Предполагая, что программа выбирает G = 11, X = 6, Y = 5, результат будет следующим:
[1, 6, 36, 11, 25, 27, 39, 29, 10, 19, 32, 28, 4, 24, 21, 3, 18, 26, 33, 34, 40, 35, 5, 30, 16, 14, 2, 12, 31, 22, 9, 13, 37, 17, 20, 38, 23, 15, 8, 7]
Третий пример
Н = 37
Предполагая, что программа выбирает G = 2, X = 9, Y = 4, результат будет следующим:
1 14 32 38 40 27 9 3
18 6 2 28 23 35 39 13
37 26 36 12 4 15 5 29
10 17 33 11 31 24 8 30
16 19 20 34 25 22 21 7
Подсчет очков
Стандартные правила гольфа с кодом: побеждает наименьшее количество байтов кода, дающих правильный результат!
#код-гольф #теория чисел #простые числа