Итерированная последовательность фи


13

Связанный: повторная функция phi (n) .

Ваша задача состоит в том, чтобы вычислить повторную функцию phi:

f(n) = number of iterations of φ for n to reach 1.

Где φнаходится Функция Эйлера .

Родственный OEIS .

Вот график этого:

введите описание изображения здесь


Правила:

Ваша цель - выводить f(n)из n=2в n=100.

Это код-гольф, поэтому выигрывает самый короткий код.

Вот значения, с которыми вы можете проверить:

1, 2, 2, 3, 2, 3, 3, 3, 3, 4, 3, 4, 3, 4, 4, 5, 3, 4, 4, 4, 4, 5, 4, 5, 4, 4, 4, 5, 4, 5, 5, 5, 5, 5, 4, 5, 4, 5, 5, 6, 4, 5, 5, 5, 5, 6, 5, 5, 5, 6, 5, 6, 4, 6, 5, 5, 5, 6, 5, 6, 5, 5, 6, 6, 5, 6, 6, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 6, 5, 6, 7, 5, 7, 5, 6, 6, 7, 5, 6, 6, 6, 6, 6, 6, 7, 5, 6, 6

@LuisMendo Исправлено, а также добавлен график + значения для проверки. :-)
Просто Красивое Искусство

1
Я отредактировал в теге колмогоровской сложности , поскольку это по существу
выводит

1
@SimplyBeautifulArt Сначала докажите, что существует конечное число значений, xнапример phi(x)конкретное фиксированное число.
user202729

2
Это хорошая задача, но я думаю, что было бы лучше просто запросить решение для реализации f(n), а не запускать его для ряда фиксированных чисел. Это также делает разницу между языками с возможностью применения функций в диапазонах с меньшим количеством байтов (частично вызов хамелеона?)
Уриэль

1
: P Вы подразумеваете, что я должен изменить вызов, чтобы дать вам преимущество? Независимо от того, как изложены эти правила, некоторые языки будут иметь преимущество, а некоторые - нет. @Uriel
Просто Красивое Искусство

Ответы:


10

Haskell , 53 52 байта

Спасибо Ними за сохранение 1 байта!

f<$>[2..100]
f 1=0
f n=1+f(sum[1|1<-gcd n<$>[1..n]])

Попробуйте онлайн!

sum[1|1<-gcd n<$>[1..n]]дает φ(n)(взято из flawr , спасибо!)

fявляется рекурсивной функцией, которая вычисляет, 1+φ(n)если n нет 1, и выводит, 0если nесть 1, так как больше нет итераций, которые необходимо выполнить для достижения1

Наконец f<$>[2..100]создает список fпримененных к каждому элементу[2..100]


7

Haskell , 70 69 68 байт

Эта функция (\n->sum[1|1<-gcd n<$>[1..n]])является последней функцией, которую мы неоднократно применяем в анонимной функции. Спасибо @laikoni за -1 байт!

РЕДАКТИРОВАТЬ: я только что узнал, что @xnor использовал эту точную totient функцию в предыдущем испытании .

length.fst.span(>1).iterate(\n->sum[1|1<-gcd n<$>[1..n]])<$>[2..100]

Попробуйте онлайн!


1
Это довольно мало для того, чтобы не иметь встроенного totient!
Луис Мендо

1
@LuisMendo H.PWiz нашел решение, которое еще короче !
flawr

7

MATL , 16 15 байт

99:Q"@`_Zptq}x@

Попробуйте онлайн!

объяснение

99:       % Push [1 2 ... 99]
Q         % Add 1 element-wise: gives [2 3 ... 100]
"         % For each k in that array
  @       %   Push k
  `       %   Do...while
    _Zp   %     Euler's totient function
     tq   %     Duplicate, subtract 1. This is the loop condition
  }       %   Finally (execute on loop exit)
  x       %     Delete
  @       %     Push latest k
          %   End (implicit)
          % End (implicit)
          % Display stack (implicit)

Старая версия, 16 байт

99:Qt"t_Zp]v&X<q

Попробуйте онлайн!

объяснение

99:       % Push [1 2 ... 99]
Q         % Add 1 element-wise: gives [1 2 ... 100]
t"        % Duplicate. For each (i.e. do the following 100 times)
  t       %   Duplicate
  _Zp     %   Euler's totient function, element-wise
]         % End
v         % Concatenate vertically. Gives a 100×100 matrix
&X<       % Row index of the first minimizing entry for each column.
          % The minimum is guaranteed to be 1, because the number of
          % iterations is more than sufficient.
q         % Subtract 1. Display stack (implicit)

1
Выводимые значения отключены одним, я думаю, Попробуйте онлайн! исправляет это (но я никогда раньше не использовал MATL, поэтому ...)
caird coinheringaahing

Проверьте конец моего поста. Это обеспечивает ожидаемый результат, к которому вы отключаетесь по одному на каждом.
Просто Красивое Искусство

Первые 5 значений, выведенных вашим текущим ответом, - это 2 3 3 4 3, когда 1 2 2 3 2
задание

@cairdcoinheringaahing и SimplyBeautifulArt Ах, я вижу. Благодарность! Исправлено сейчас
Луис Мендо

6

Желе , 12 11 10 9 байт

³ḊÆṪÐĿ>1S

Попробуйте онлайн!

-1 байт благодаря HyperNeutrino!

-1 байт благодаря мистеру Xcoder!

-1 байт благодаря Денису

Как это устроено

³ḊÆṪÐĿ>1S - Main link. No arguments
³         - Yield 100
 Ḋ        - Dequeue. Creates the list [2, 3 ... 99, 100]
    ÐĿ    - For each element, while the results of the next function
          - aren't unique, collect the results...
  ÆṪ      -   Next function: Totient
      >1  - Greater than one?
        S - Sum the columns

Поскольку это было сделано Деннисом, я (по понятным причинам) понятия не имею, почему это работает, просто так оно и есть.


1
@dylnan Все три ответа выводят список из f(n)от 2до 100, и вопрос не включает ввод, поэтому я думаю, что это правильная версия
caird coinheringaahing

@dylnan Задача просит выхода fна n=2к n=100, а не только одно значение.
Просто Красивое Искусство

Вы правы, я прочитал начало испытания и четко не прочитал часть правил
dylnan

А что касается кода, можно ли будет использовать #в этом случае? Что - то вроде этого (который явно не работает , но написана кем - то , кто понимает синтаксис ясно!)
dylnan

@dylnan Возможно, но, поскольку мы генерируем фиксированный список, применять к каждому элементу обычно лучше, чем #.
caird coinheringaahing

6

APL (Dyalog) , 50 29 25 байтов

Смотри, нет, встроенный туалет!

4 байта сохранены благодаря @ H.PWiz

{⍵=1:01+∇+/1=⍵∨⍳⍵}¨1+⍳99

Попробуйте онлайн!

Как?

По-видимому, сначала я выбрал более длинную (и более сложную) формулу totient. Смотрите историю изменений.

⍳⍵ - 1 to n

⍵∨ - gcd with n

1= - equal to 1?

+/ - sum 'em all

Это тотент. Все остальное - обертка для counting ( 1+∇) и применения к range 2..100( ¨1+⍳99).



4

J REPL, 23 байта

<:#@(5&p:^:a:)"0|2+i.99

Я не проверял, но это, вероятно, работает в обычном J, если вы определяете его как существительное (я играл в гольф на своем телефоне в REPL).

Встроенные модули, йо.

Я бы сказал, что есть как минимум 2-3 байта для сброса (один за другим из-за способа a:работы, необходимости использовать его |в качестве функции и т. Д.).


1
+/*<:5&p:^:a:2+i.99 для 19 байт Попробуйте онлайн!
Гален Иванов

Для дальнейшего использования вы можете использовать также "+вместо "0, чтобы он мог также стать<:#@(5&p:^:a:)"+i.99
Конор О'Брайен

2
16 bytes with +/1<a:5&p:2+i.99
miles

1
@ miles : Can you explain the use of a: in your code? How does it work instead of ^:?
Galen Ivanov

1
@GalenIvanov (5&p:)^:a: m can be done as a: 5&p: m using the other definition of & when a dyad is bonded with a noun and then called dyadically.
miles

4

JavaScript (ES6), 115 ... 104 99 bytes

Hard-coding might be shorter, but let's try a purely mathematical approach.

f=n=>n>97?6:(P=(n,s=0)=>k--?P(n,s+(C=(a,b)=>b?C(b,a%b):a<2)(n,k)):s>1?1+P(k=s):1)(k=n+2)+' '+f(-~n)

console.log(f())


Hard-coding is 90 bytes (pastebin link)
Herman L

@HermanLauenstein Nicely done.
Arnauld


3

Python 2, 82 bytes

l=0,1
exec"n=len(l);p=2\nwhile n%p:p+=1\nl+=l[p-1]+l[n/p]-n%4%3/2,;print l[n];"*99

Try it online!

This uses the observations that:

  • f(a*b) = f(a) + f(b) - 1, except the -1 is omitted if a and b are both even
  • f(p) = f(p-1) + 1 when p is prime, with f(2)=1

These imply that if n has prime factorization n = 2**a * 3**b * 5**c * 7**d * 11**e * ..., then f(n) = max(a,1) + b + 2*c + 2*d + 3*e + ..., where each p>2 in the factorization contributes f(p-1).

I'm not sure if these continue to hold past n=100, but if they do, they give a way to define and calculate f without using φ.


2

Bubblegum, 49 bytes

00000000: 5d88 0511 0020 0003 ab2c 024e ff64 e8a3  ].... ...,.N.d..
00000010: 379f 956b f05d 206c 0545 7274 743a b876  7..k.] l.Ertt:.v
00000020: 2267 27f9 9f4d 9b9d fc85 e7e6 994d 6eb0  "g'..M.......Mn.
00000030: 2b                                       +

Try it online!


2

PowerShell, 110 bytes

$a=,0*101;2..100|%{$i=$_;for($z=$j=0;++$j-lt$i;$z+=$k-eq1){for($k=$j;$j%$k-or$i%$k;$k--){}};($a[$i]=$a[$z]+1)}

Try it online!

Математический подход.

На самом деле, просматривая его, очень похоже на ответ C , но разрабатывается самостоятельно. Создает массив 0s, циклы от 2до 100, а затем вычисляет phiс использованием gcdформулировки. Часть в конце (parens) сохраняет результат в $aследующем цикле и помещает копию в конвейер, что приводит к неявному выводу.


PowerShell, 112 байт

"122323333434344534444545444545555545455645555655565646555656556656665656565656656757566756666667566"-split'(.)'

Попробуйте онлайн!

Hard кодировка. Ho-гул. Короче, чем я мог получить математический подход примерно на 10-15 байтов.


Интересно, нужен ли вам разделитель, так как все числа однозначные :)
flawr

1
Можете ли вы показать нам свой математический подход? Это выглядит намного интереснее, конечно: P
Конор О'Брайен

2
@ ConorO'Brien К счастью, сегодня утром я смог взглянуть на него свежим взглядом и сыграть в математический подход под жестко закодированным подходом.
AdmBorkBork

2

Python 2 , 83 байта

n=2
exec"print len(bin(n))-3+n%2-~n%9/8-(0x951a5fddc040419d4005<<19>>n&1);n+=1;"*99

Попробуйте онлайн!

Сочетания эвристический оценка с HARDCODED константой , которая корректирует каждую оценку либо как -0или -1.


2

Шелуха , 10 17 байт

mö←LU¡Sȯṁε⌋ḣtḣ100

Попробуйте онлайн!

Редактировать : +7 байт для фактического отображения функции по диапазону, который был запрошен, прежде чем это была только функция, вычисляющая A003434 .

объяснение

Следующие вычисления A003434 :

←LU¡S(ṁ(ε⌋))ḣ -- takes a number as input, for example: 39
   ¡          -- iterate the following function on the input: [39,24,8,4,2,1,1,1..]
    S(     )ḣ --   with itself (x) and the range [1..x]..
      ṁ(  )   --   ..map and sum the following
        ε⌋    --     0 if gcd not 1 else 1
  U           -- longest unique prefix: [39,24,8,4,2,1]
 L            -- length: 6
←             -- decrement: 5

m(....)ḣ100Часть просто отобразить эту функцию в диапазоне [2..100], не знаю , как я пропустил эту часть раньше: S


1

PHP, 98 байт

1,2,<?=join(',',str_split(unpack('H*','##3444E4DEEDEEUUEEVEUVUVVFUVVUfVfVVVVVegWVgVffgV')[1]))?>,6

Попробуйте онлайн!

Я упаковал все цифры в двоичную строку. После распаковки, преобразования его в массив и последующего слияния массива мне нужно было только добавить 1,2 и добавить 6, так как они не подходят или вызывают появление контрольного кода.



1

05AB1E , 11 байт

тL¦ε[DNs#sÕ

Попробуйте онлайн!

объяснение

тL¦           # push range [2 ... 100]
   ε          # apply to each
    [         # start a loop
     D        # duplicate the current number
      N       # push the loop iteration counter
       s      # swap one copy of the current number to the top of the stack
        #     # if true, break the loop
         s    # swap the second copy of the current number to the top of the stack
          Õ   # calculate eulers totient

1

C 112 байтов

a[101];f(i,j,k,t){for(a[i=1]=0;i++<100;printf("%d ",a[i]=a[t]+1))for(t=j=0;++j<i;t+=k==1)for(k=j;j%k||i%k;k--);}

Ungolfed:

a[101];
f(i,j,k,t){
    for(a[1]=0,i=2;i<=100;i++) {   // initialize
        for(t=j=0;++j<i;t+=k==1)   // count gcd(i, j) == 1 (t = phi(i))
            for(k=j;j%k||i%k;k--); // calculate k = gcd(i, j)
        printf("%d ",a[i]=a[t]+1); // print and store results
    }
}

Попробуйте онлайн!


0

Алюминий , 87 байт

hhhhhdadtqdhcpkkmzyhqkhwzydqhhwdrdhhhwrysrshhwqdrybpkshehhhwrysrarhcpkksyhaydhehycpkkmr

Попробуйте онлайн!

объяснение

hhhhhdadt      CONSTANT 100

RANGE FROM 100 to 0
q
  dhc
p

REMOVE 0 AND 1
kk

OVER EACH ELEMENT...
m
  zyh
  q
    kh
    wzyd
    q
      DUPLICATE TOP TWO ELEMENTS...
      hhwdrdhhhwrysrshhw
      GCD...
      qdryb
    p
    ks
    he
    hhhw
    ry
    s
    rarhc
  p
  IS IT ONE? IF SO TERMINATE (FIXPOINT)
  kksyhaydhehyc
p
kk
m
REVERSE THE VALUES
r

0

Pyth, 38 байт (неконкурентный)

.e-+1sl+1kb_jC"Éõ4ÕYHø\\uÊáÛ÷â¿"3

Попробуйте это на Pyth Herokuapp , потому что он не работает на TIO по любой причине.

Я не сомневаюсь, что явное решение Pyth меньше, но я хотел посмотреть, насколько маленьким я мог бы получить код, сжимая последовательность, и выучить Pyth, я думаю. При этом используется тот факт, что верхняя граница последовательностиlog2(n)+1 .

объяснение

.e-+1sl+1kb_jC"Éõ4ÕYHø\\uÊáÛ÷â¿"3
             C"Éõ4ÕYHø\\uÊáÛ÷â¿"   interpret string as base 256 integer
            j                   3  convert to array of base 3 digits
           _                       invert sequence (original had leading 0s)
.e                                 map with enumeration (k=index, b=element)
       +1k                                   k+1
     sl                            floor(log(   ))
   +1                                             +1
  -       b                                         -b

Я получил сжатую строку через Ci_.e+1-sl+1ksb"122323333434344534444545444545555545455645555655565646555656556656665656565656656757566756666667566"3, которая является противоположностью приведенного выше кода с несколькими преобразованиями типов.


1
Почему неконкурентоспособен?
Просто Красивое Искусство

@SimplyBeautifulArt на самом деле не означает неконкурентоспособность в формальном смысле; отредактировал название, чтобы сделать это более ясным
звездный

0

Ом v2 , 41 байт

“ ‽W3>€þΣÌιZ§Á HgüυH§u·β}Bā€ΣNπáÂUõÚ,3“8B

Попробуйте онлайн!

Буквально полностью закодированный ... Я фактически взял приведенную выше последовательность, удалил все, что не было числом, интерпретировал его как основание 8, а затем превратил его во встроенное представление числа 255 Ома. Это то, что делают цитаты. Затем программа просто превращает это в базу 8 снова.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.