GolfScript (23 символи)
{:^((1${\.**2^?%}+*}:f;
Результатом дозорного для неіснуючого зворотного є 0
.
Це просте застосування теореми Ейлера . , тому x - 1 ≡ x 2 n - 1 - 1xφ(2n)≡1(mod2n)х- 1≡ x2n - 1- 1( мод2н)
На жаль, це занадто великий показник прямого обчислення, тому нам доводиться використовувати цикл і робити модульне скорочення всередині циклу. Ітеративний крок і у нас є вибір базового випадку: або зх2к- 1= ( х2k - 1- 1)2× хk=1
{1\:^(@{\.**2^?%}+*}:f;
або k=2
з
{:^((1${\.**2^?%}+*}:f;
Я працюю над іншим підходом, але дозорний складніше.
Ключове зауваження полягає в тому, що ми можемо побудувати обернутий біт на біт: якщо xy≡1(mod2k−1)xy∈{1,1+2k−1}(mod2k)xx(y+xy−1)≡1(mod2k)y′=(x+1)y−1
0x≡1(mod20) we get, by induction
x(1−(x+1)nx)≡1(mod2n)
де зворотною є сума геометричної послідовності. Я показав деривацію, щоб уникнути ефекту кролика з капелюхом: враховуючи цей вираз, легко зрозуміти, що (враховуючи, що скорбоване значення є цілим числом, що випливає з його виведення як суми цілого числа послідовність) продукт зліва повинен бути у правій клаві еквівалентності, якщох + 1 рівномірний.
Це дає 19-знакову функцію
{1$)1$?@/~)2@?%}:f;
що дає правильні відповіді на входи, які мають зворотну. Однак коли це не так простохрівномірний. Один з потенційно цікавих варіантів, які я знайшов - це додати, x&1
а не 1
.
{1$.1&+1$?@/~)2@?%}:f;
Це, здається, дає дозорні значення будь-якого 0 або 2n - 1, але я ще цього не довів.
Зробивши цей крок далі, ми можемо забезпечити дозорну службу 0 для парних чисел, змінюючи вираз 1 - ( x + 1 )н в 1 - 1н:
{1$.1&*)1$?@/~)2@?%}:f;
Це пов'язане з прямим застосуванням теореми Ейлера для довжини коду, але буде мати гірші показники для великих н. Якщо взяти аргументи навпаки n x f
, ми можемо зберегти один символ і дістатися до 22 символів :
{..1&*)2$?\/~)2@?%}:f;