Gaussian целое представляет собой комплексное число, действительные и мнимые части являются целыми числами.
Гауссовы целые числа, как и обычные целые, могут быть представлены как произведение гауссовых простых чисел уникальным образом. Задача здесь состоит в том, чтобы вычислить простые составляющие данного гауссова целого числа.
Входные данные: гауссово целое число, которое не равно 0 и не является единицей (т. Е. 1, -1, i и -i не могут быть заданы в качестве входных данных). Используйте любой разумный формат, например:
- 4-5i
- -5 * J + 4
- (4, -5)
Вывод: список гауссовых целых чисел, которые являются простыми (т.е. ни одно из них не может быть представлено как произведение двух неединичных гауссовых целых чисел), и произведение которых равно входному числу. Все числа в списке вывода должны быть нетривиальными, т. Е. Не 1, -1, i или -i. Любой разумный выходной формат может быть использован; он не обязательно должен совпадать с форматом ввода.
Если список вывода содержит более 1 элемента, возможны несколько правильных выходов. Например, для входа 9 выход может быть [3, 3] или [-3, -3] или [3i, -3i] или [-3i, 3i].
Контрольные примеры (из этой таблицы ; 2 строки на контрольный пример)
2
1+i, 1-i
3i
3i
256
1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i
7+9i
1+i,2−i,3+2i
27+15i
1+i,3,7−2i
6840+585i
-1-2i, 1+4i, 2+i, 3, 3, 6+i, 6+i
Встроенные функции для факторизации гауссовых целых чисел не допускаются. Факторинг обычных целых чисел встроенными функциями допускается.
источник
3i
возвращаться как3,i
или3i
?3i
правильный ответ, потому чтоi
не простое число. Я обновил тестовый пример, чтобы сделать его более понятным.6840+585i
неверный список факторов, так как5
не является гауссовым штрихом. Вместо этого он возвращается-1-2i, 1+4i, 2+i, 3, 3, 6+i, 6+i
. Источник256=(1+i)**16
не(1+i)**8
потому , что256=2**8=(2i)**8
и2i=(1+i)**2
Ответы:
Желе ,
6155 байтПопробуйте онлайн! (Верхний и нижний колонтитулы форматируют вывод)
-6 байт благодаря @EricTheOutgolfer
Как это работает
источник
Рубин ,
258256249246 + 8 =264257254 байтаИспользует
-rprime
флаг.Боже, какой беспорядок.
Использует этот алгоритм из stackoverflow.
Попробуйте онлайн!
источник
Python 2 ,
250239223215 байтПопробуйте онлайн!
(a,b)
Некоторое объяснение рекурсивно разлагает комплекс на два комплекса, пока разложение невозможно ...
источник
def f(Z,s=[])
должен спасти вас персонажРжавчина - 212 байт
Я не уверен на 100%, работает ли это на 100% правильно, но кажется, что это правильно для большого диапазона тестов. Это не меньше, чем желе, но, по крайней мере, он меньше, чем интерпретируемые языки (пока). Он также кажется более быстрым и может работать за счет миллиардов величин менее чем за секунду. Например, 1234567890 + 3141592650i коэффициенты как (-9487 + 7990i) (- 1 + -1i) (- 395 + 336i) (2 + -1i) (1 + 1i) (3 + 0i) (3 + 0i) (4+ 1i) (- 1 + 1i) (- 1 + 2г), (нажмите здесь, чтобы проверить альфа вольфрама)
Это началось с той же идеи, что и наивный факторинг целых чисел, чтобы просмотреть каждое число ниже целого числа, посмотреть, делит ли оно, повторить до конца. Затем, вдохновленный другими ответами, он трансформировался ... он многократно учитывает элементы в векторе. Он делает это много раз, но не до тех пор, пока «ничего». Количество итераций было выбрано, чтобы охватить большую часть разумных входных данных.
Он по-прежнему использует "(a mod b) == 0", чтобы проверить, делит ли одно целое число на другое (для гауссиан мы используем встроенный модуль Rust по Гауссу по модулю и считаем "0" нормой == 0), однако проверка для 'нормы ( a / b)! = 1 'предотвращает деление «слишком много», в основном позволяя заполнить результирующий вектор только простыми числами, но не переводя ни один элемент вектора в единицу (0-i, 0 + i, -1 + 0i, 1 + 0i) (что запрещено вопросом).
Пределы для петли были найдены в ходе эксперимента. y переходит от 1 кверху, чтобы предотвратить панику деления на ноль, а x может переходить от -999 до 0 благодаря отражению гауссиан над квадрантами (я думаю?). Что касается ограничений, то в первоначальном вопросе не был указан допустимый диапазон ввода / вывода, поэтому предполагается «разумный размер ввода» ... (Правка ... однако я не совсем уверен, как рассчитать, по какому числу это будет начинаю "терпеть неудачу", я думаю, что есть гауссовы целые числа, которые не делятся ничем ниже 999, но все еще удивительно малы для меня)
Попробуй версию без пристрастия на play.rust-lang.org
источник
Perl 6 ,
141124 байтаСпасибо Джо Кингу за -17 байт
Попробуйте онлайн!
источник
floor
Часть проверяет, является ли$_/w
(т.е. текущий коэффициент, деленный на число) целым числомPyth ,
5451454236 байтПопробуйте онлайн!
Принимает ввод в виде
1+2j
- чисто действительные или мнимые числа могут опускать другие компоненты (например9
,2j
). Выходные данные - это разделенный новой строкой список комплексных чисел в форме(1+2j)
с чисто мнимыми числами, пропускающими действительную часть.При этом используется простое деление трейла, генерирующее все гауссовы целые числа с величиной больше 1 и меньше текущего значения, а также самого значения. Они фильтруются, чтобы сохранить те, которые являются фактором значения, и наименьшее по величине выбирается в качестве следующего основного фактора. Это вывод, и значение делится на него, чтобы получить значение для следующей итерации.
Кроме того, Пиф избивает Желе though (хотя я не ожидаю, что это продлится)
источник