Мне нравится думать о 10-адическом числе как о числе, которое идет бесконечно влево, или о целом числе по очень очень большой степени 10.
Вещи несут бесконечно налево и исчезают. Чтобы понять, что я имею в виду, обратите внимание, что ...6667 * 3 = 1
в 10-адической стране, так как «2», которая несет налево, уходит в бесконечность.
Сложение и умножение имеют смысл для 10-адических чисел, поскольку последние n
цифры суммы / произведения зависят только от последних n
цифр слагаемых / мультипликатов.
Учитывая n
, вам нужно вывести последние n
цифры 10-адического кубического корня из 3, то есть x
удовлетворительно x*x*x = 3
.
Это конец:
...878683312291648481630318492665160423850087895134587
Ваш код должен прекратить действие n=1000
до отправки.
Предположим, что если число, которое вам нужно напечатать, начинается с нуля, то вам не нужно печатать ведущие нули, так как на самом деле нет смысла печатать лишние нули.
Это код-гольф . Кратчайший ответ в байтах побеждает.
источник
n=12
вывод87895134587
вместо087895134587
. Лично я бы сделал это необязательным, поскольку это сделало бы недействительными почти все ответы ..Ответы:
Python 2 , 33 байта
Попробуйте онлайн!
pow
Функция эффективно вычисляет модульный показатель3**(10**k*2/3+1)%10**k
.Нас просят найти решение
r**3 = 3 (mod 10**k)
. Мы хотим найти экспоненту,e
для которой картаx -> x**e
обратна модулюx -> x**3
работы куба10**k
, так же, как экспоненты дешифрования и шифрования в RSA отменяют, чтобы получить исходное значение. Это значит, что(x**3)**e = x (mod 10**k)
для всехx
. (Мы будем предполагать на протяжении всего этогоgcd(x,10) = 1
.) Затем мы можем восстановитьr
, перевернув куб, чтобы получитьr = 3**e (mod 10**k)
.Расширяясь
(r**3)**e = r (mod 10**k)
, мы получаемМы ищем показатель,
3*e-1
который гарантирует умножение, которое дает нам столько копий1
.Умножение по модулю
10**k
образует группу для обратимых чисел, то есть сgcd(x,10) = 1
. По теореме Лагранжа,x**c = 1
гдеc
число элементов в группе. Для группы по модулюN
, что граф является значением Эйлераφ(N)
, число значений от1
доN
, взаимно простое сN
. Итак, у нас естьr**φ(10**k) = 1 (mod 10**k)
. Следовательно, его достаточно для3*e-1
кратностиφ(10**k)
.Мы вычисляем
Итак, мы хотим
3*e-1
быть кратным4 * 10**(k-1)
Возможны многие варианты
r
, ноr=5
дает краткое выражениес
e
целым номером. Небольшая игра в гольф с использованием разделения пола сокращаетe
до10**k*2/3+1
, а экспрессияr = 3**e (mod 10**k)
дает желаемый результатr
.источник
(r**3)**e = x (mod 10**k)
быть(r**3)**e = r (mod 10**k)
? И это просто совпадение(2 * 10**k + 1)/3 = 1/3 (mod 10**k)
?2
на любое числоx = 2 (mod 3)
Python 2 (PyPy) ,
5550 байт-5 байт благодаря @HP Wiz !
Попробуйте онлайн!
Вычисляет (не брутфорс) цифра за цифрой, поэтому это быстрее, чем грубая сила.
Версия без exec
объяснение
(Спасибо @Leaky Nun и @ user202729 за это)
Во-первых, обратите внимание, что
n**3
это инволюция по модулю 10 (то есть, если функция вызываетсяf
, тоf(f(n)) == n
). Это можно подтвердить с помощью исчерпывающего поиска.Мы можем использовать математическую индукцию, чтобы найти следующую цифру.
Позвольте быть th цифрой числа (справа).
dn
n
Теперь предположим, что мы знаем число с точностью до
k
десятой цифры,x
Мы знаем это:
Подставляя это в:
источник
11
цифры дляn=12
иn=13
.Wolfram Language (Mathematica) , 21 байт
Попробуйте онлайн!
источник
05AB1E ,
1713 байтПорт ответа @ ASCII-только Python 2 (PyPy) .
-4 байта И исправлена ошибка для выходов с ведущими нулями благодаря @Emigna , заменяя
T%N°*+
наθì
.Попробуйте онлайн.
Объяснение:
источник
T%N°*+
сθì
нуля, стало хорошим бонусом при таком подходе.Java 8,
158156141136135 байтовПорт ответа @ ASCII-только Python 2 (PyPy) .
-2 байта благодаря @Neil .
-20 байт благодаря @ ASCII-only .
ПРИМЕЧАНИЕ. Ответ @ OlivierGrégoire на Java уже намного короче. использованием алгоритмического подхода
modPow
.Попробуйте онлайн.
Объяснение:
источник
java.math.BigInteger u=null,r=u.valueOf(7),t=r;
?java.math.BigInteger t=null,r=u.valueOf(7);t=r;
изначально , прежде чем я добавил ,u
чтобы сохранить несколько байт.Java (JDK 10) , 106 байт
Попробуйте онлайн!
кредиты
источник
for(int l=0,d;++l<=n;
иBigInteger I=null;
наvar I=new BigInteger("3");
который мы можем использовать повторно.for(int l=0,d;l++<n;)
.дк , 15
Использует модульное возведение в степень, как и ответ @ xnor .
Попробуйте онлайн!
TIO рассчитывает ввод = 1000 в 21 с.
источник
Пиф , 12
Попробуйте онлайн!
Снова, используя модульное возведение в степень, как ответ @ xnor .
источник
Haskell , 37 байт
1 байт сохранен благодаря ASCII-только!
Попробуйте онлайн!
Я использую аналогичный подход только к ASCII, но я избегаю использования деления
источник
Pyth , 23 байта
Конечно, это использует подход только ASCII.
Попробуй это здесь!
источник
Древесный уголь ,
2622 байтаПопробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Инициализируйте результат до 7. (Не должно быть 7, но 0 не работает.)
Цикл по количеству необходимых цифр.
Теперь использует подход @ HPWiz для сохранения 4 байтов.
Распечатайте результат.
Вот 28-байтовая версия с перебором, которая берет кубические корни произвольных значений:
Попробуйте онлайн! Ссылка на подробную версию кода. Первый ввод - это число цифр, второй - значение для корня.
источник
k
с обратным списком в качестве базового числа 10.Base(Reverse(u), 10)
но префиксk
стоил бы 4 байта, в то время как выполнение строки в виде строки стоит всего 2 байта, что приводит к экономии в 1 байт послеCast
учета.J , 33 байта
TIO
порт ответа @ ASCII-only, но с использованием фиксированного значения по модулю 10 ^ n
источник
Желе ,
231817 байтПопробуйте онлайн!
Я знаю,
ƒ
будет полезно.источник