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


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) .

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


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

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

Выходы 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.