Доступні номери


14

Визначення

  • Функція Euler Phi ( функція AKA totient ): функція, яка приймає додатне число і повертає число додатних чисел, менших за задане число, яке є спів-простим із заданим числом. Позначається як φ(n).

  • Доступне число : якщо існує додатне ціле число xтаке φ(x) == n, то воно nє доступним .

Завдання

Напишіть функцію / програму, щоб визначити, чи доступне дане додатне ціле число.

Вхідні дані

Позитивна цифра в будь-якому розумному форматі. Можна припустити, що число знаходиться в межах можливості мови. Одинарне введення прийнято.

Вихідні дані

Два послідовних значення, одне для доступних чисел, а інше для недоступних чисел. Дві значення можуть бути будь-якими, якщо вони є послідовними.

Тестові шафи

Доступні номери нижче 100:

1, 2, 4, 6, 8, 10, 12, 16, 18, 20, 22, 24, 28, 30, 32, 36, 40, 42, 44, 46, 48, 52, 54, 56, 58, 60, 64, 66, 70, 72, 78, 80, 82, 84, 88, 92, 96

( A002202 на OEIS)

Правила

Застосовуються стандартні лазівки .

Критерій виграшу

Це . Подання з найнижчим числом байтів виграє.

Список літератури


також доречно: oeis.org/A264739
лимон

1
Я пропоную винагороду за однорядну відповідь Retina, де один рядок - це звичайний регулярний вираз (без зворотних посилань).
Лина монашка

@LeakyNun Я мало розгублений, до цих пір я розумію, що phi(n) = count { m : 1 <= m <= n AND (m,n) are coprime }.. це правда?
Халед.К

@ Khaled.K так, це правда.
Лина монашка

Відповіді:


6

Желе , 7 6 байт

²RÆṪe@

Не зовсім швидко. Повертає 1 або 0 .

Спробуйте в Інтернеті!

Як це працює

²RÆṪe@  Main link. Argument: n

²       Square; yield n².
 R      Range; yield [1, ..., n²].
  ÆṪ    Compute the totient of each integer in the range.
    e@  Exists swap; test if n occurs in the generated array.

Як це працює?
Leaky Nun

1
Груба сила. Існує нижня межа для функції totient, тому достатньо взяти достатньо великий діапазон, відмітити тотиент і перевірити наявність вхідних даних.
Денніс

Чи можете ви довести, що квадратний корінь є мінімальним?
Leaky Nun

Квадратний корінь насправді не є нижньою межею, але квадратний корінь, розділений на sqrt (2), є. Я впевнений, що подвоєння не потрібно, але доведеться почекати, поки я засну. Занадто втомився прямо зараз.
Денніс

4
@LeakyNun Власне, лема 3 цієї статті доводить, що квадратний корінь є нижньою межею, якщо n = 2k з непарними k . Оскільки k і 2k мають однаковий коефіцієнт, подвоєння не потрібно.
Денніс

6

Математика, 28 байт

EulerPhi@Range[#^2]~FreeQ~#&

Як і відповідь Дженніса на Jelly, ми обчислюємо φ-значення всіх чисел аж до квадрата вводу і бачимо, чи вводиться вхід. Повертається, Falseякщо вхід доступний, а Trueякщо ні. Так, це заплутано. Але FreeQбайт коротший MatchQ, і ей, специфікація сказала будь-які дві послідовні значення> :)


2

JavaScript (ES6), 90 82 байт

Повертається 0або true.

f=(n,x=n*2)=>x?(p=i=>(c=(a,b)=>a?c(b%a,a):b<2)(i,x)+(i&&p(--i)))(x)==n||f(n,x-1):0

Це ґрунтується на припущенні, що якщо x існує, то x ≤ 2n . Якщо виявлено помилковим, це слід оновити, щоб використовувати x=n*nзамість x=n*2(однаковий розмір, набагато повільніше).

Крайовий випадок n = 128, який потрібно обчислити ϕ (255) .

Демо


Зручно прості числа Ферма все підряд зростання , що надає послідовних крайніх випадків n=2, n=8, n=128, n=32768і n=2147483648.
Ніл

1

Аксіома, 56 байт

f(x:PI):Boolean==member?(x,[eulerPhi(i)for i in 1..2*x])

я не знаю, чи правильно це ... код тесту та результати

(35) -> [i  for i in 1..100|f(i)]
   (35)
   [1, 2, 4, 6, 8, 10, 12, 16, 18, 20, 22, 24, 28, 30, 32, 36, 40, 42, 44, 46,
    48, 52, 54, 56, 58, 60, 64, 66, 70, 72, 78, 80, 82, 84, 88, 92, 96, 100]

Діапазон 1 .. (2 * x) буде нормальним, поки вхід x = 500 ...




0

05AB1E , 13 12 байт

EDIT : Збережений байт, оскільки вхід повторно використовується, якщо стек не має достатньо елементів.

Виходи 1, якщо вони доступні, 0 якщо ні.

Спирається на припущення, що x ≤ 2n, якщо воно існує.

xGNÕQi1,q}}0

Спробуйте в Інтернеті!

Як це працює

              # implicit input    
x            # push input, 2 * input
 G           # for N in 1..2*input
             # implicit push input
  N          # push N
   Õ         # push totient of N
    Q        # check if both are equal
     i.      # if equal
      1,     # print 1
        q    # quit program
         }   # end if
          }  # end for
           0 # push 0 if condition never reached
             # implicit print

0

C, 123 байти

g(a,b){return!a?b:g(b%a,a);}
i;r;f(n){for(i=2,r=1;i<n;i++)r+=(g(i,n)==1);}
t;k;s(m){for(k=m,t=0;!t&(k<m*m);)f(++k),t=(r==m);}

Спробуйте в Інтернеті

#include <stdio.h>

// gcd function
g(a,b){return!a?b:g(b%a,a);}

// Euler phi(x) function
i;r;f(n){for(i=2,r=1;i<n;i++)r+=(g(i,n)==1);}

// check if m is reachable, phi(x) for x in (m , m^2]
t;k;s(m){for(k=m,t=0;!t&(k<m*m);)f(++k),t=(r==m);}

main()
{
    // print all reachable number below 50
    for(int x=1; x<50; x++)
    {
        s(x);

        if(t)
        {
            printf(" %d ~ phi(%d) \n", x, k);
        }
    }
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.