Доступные номера

14

Определения

  • Функция Эйлера Пи (функция токового AKA ): функция, которая принимает положительное число и возвращает число положительных чисел меньше заданного числа, которые взаимно просты с заданным числом. Обозначается какφ(n) .

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

задача

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

вход

Положительное число в любом разумном формате. Можно предположить, что число находится в пределах возможностей языка. Унарный ввод принят.

Выход

Два непротиворечивых значения, одно для доступных номеров, а другое для недоступных номеров. Эти два значения могут быть чем угодно, если они согласованы.

Testcases

Доступные цифры ниже 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 }... это правда?
Халед.К
@ Халед. Да, это правда.
Дрянная Монахиня

Ответы:

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.
Деннис
источник
Как это работает?
Утренняя монахиня
1
Грубая сила. Существует нижняя граница для функции totient, поэтому достаточно взять достаточно большой диапазон, сопоставить totient и проверить наличие входных данных.
Деннис
Можете ли вы доказать, что квадратный корень является минимумом?
Утренняя монахиня
Квадратный корень на самом деле не является нижней границей, но квадратный корень, деленный на sqrt (2), равен. Я уверен, что дублирование не требуется, но доказательство придется подождать, пока я немного посплю. Слишком усталый прямо сейчас.
Деннис
4
@LeakyNun На самом деле лемма 3 этой статьи доказывает, что квадратный корень является нижней границей, если n = 2k с нечетным k . Поскольку k и 2k имеют одинаковое значение, удвоение не требуется.
Деннис
6

Mathematica, 28 байт

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

Как и ответ Денниса «Желе», мы вычисляем значения φ всех чисел вплоть до квадрата ввода и видим, есть ли в нем вход. Возвращает, 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) .

демонстрация

Arnauld
источник
Удобно простые числа Ферма все подряд рост , придающий последовательных крайних случаев 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 ...

RosLuP
источник
0

05AB1E , 13 12 байт

РЕДАКТИРОВАТЬ : Сохраненный байт, потому что ввод используется повторно, если в стеке недостаточно элементов.

Выходы 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);
        }
    }
}
Khaled.K
источник
102 байта
floorcat