Urutan phi berulang

13

Terkait: Iterated phi (n) berfungsi .

Tantangan Anda adalah menghitung fungsi phi yang diulang:

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

Dimana φadalah fungsi totient Euler .

OEIS terkait .

Ini grafiknya:

masukkan deskripsi gambar di sini


Aturan:

Tujuan Anda adalah untuk output f(n)dari n=2ke n=100.

Ini kode-golf, jadi kode terpendek menang.

Berikut nilai yang dapat Anda periksa:

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
Seni Cukup Indah
sumber
@LuisMendo Tetap, dan juga menambahkan nilai grafik + untuk memeriksa. :-)
Simply Beautiful Art
1
Saya telah mengedit tag kompleksitas-kolmogorov , karena ini pada dasarnya menghasilkan nilai tetap
caird coinheringaahing
1
@SimplyBeautifulArt Pertama-tama membuktikan bahwa ada banyak nilai hingga xseperti itu phi(x)adalah nomor tetap tertentu.
user202729
2
Ini adalah tantangan yang bagus, tetapi saya pikir akan lebih baik untuk hanya meminta solusi untuk diterapkan f(n), daripada menjalankannya pada berbagai nomor tetap. Ini juga membuat perbedaan antara bahasa dengan kemampuan untuk menerapkan fungsi pada rentang dengan lebih sedikit byte (sebagian tantangan bunglon?)
Uriel
1
: P Apakah Anda menyiratkan bahwa saya harus mengubah tantangan untuk memberi Anda keuntungan? Terlepas dari bagaimana aturan ini dinyatakan, beberapa bahasa akan memiliki keunggulan dan beberapa tidak. @Uriel
Simply Beautiful Art

Jawaban:

10

Haskell , 53 52 byte

Terima kasih nimi karena telah menghemat 1 byte!

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

Cobalah online!

sum[1|1<-gcd n<$>[1..n]]memberi φ(n)(Diambil dari flawr , terima kasih!)

fadalah fungsi rekursif yang menghitung 1+φ(n)jika n tidak 1, dan output 0jika nini 1, karena tidak ada lagi iterasi yang akan diambil untuk mencapai1

Akhirnya f<$>[2..100]membuat daftar fditerapkan untuk setiap elemen[2..100]

H.Piz
sumber
7

Haskell , 70 69 68 byte

Fungsi (\n->sum[1|1<-gcd n<$>[1..n]])ini adalah fungsi totient, yang berulang kali kami terapkan dalam fungsi anonim. Terima kasih @laikoni untuk -1 byte!

EDIT: Saya baru saja menemukan @xnor menggunakan fungsi total yang tepat ini dalam tantangan sebelumnya .

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

Cobalah online!

cacat
sumber
1
Ini cukup singkat karena tidak memiliki builtin totient!
Luis Mendo
1
@LuisMendo H.PWiz menemukan solusi yang bahkan lebih singkat !
flawr
7

MATL , 16 15 byte

99:Q"@`_Zptq}x@

Cobalah online!

Penjelasan

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)

Versi lama, 16 byte

99:Qt"t_Zp]v&X<q

Cobalah online!

Penjelasan

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)
Luis Mendo
sumber
1
Nilai yang dikeluarkan mati oleh satu, saya pikir Coba online! mengoreksi itu (tapi saya belum pernah menggunakan MATL sebelum jadi ...)
caird coinheringaahing
Periksa akhir posting saya. Ini memberikan output yang diharapkan, di mana Anda pergi dengan satu pada masing-masing.
Simply Beautiful Art
5 nilai pertama yang dihasilkan oleh jawaban Anda saat ini adalah 2 3 3 4 3, ketika tantangan mengatakan bahwa itu seharusnya1 2 2 3 2
caird coinheringaahing
@cairdcoinheringaahing dan SimplyBeautifulArt Ah, begitu. Terima kasih! Diperbaiki sekarang
Luis Mendo
6

Jelly , 12 11 10 9 byte

³ḊÆṪÐĿ>1S

Cobalah online!

-1 byte terima kasih kepada HyperNeutrino!

-1 byte terima kasih kepada Tn. Xcoder!

-1 byte terima kasih kepada Dennis

Bagaimana itu bekerja

³ḊÆṪÐĿ>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

Karena ini dibuat oleh Dennis, saya (dimengerti) tidak tahu mengapa ini bekerja, hanya saja itu terjadi.

caird coinheringaahing
sumber
1
@dylnan Ketiga jawaban menampilkan daftar f(n)dari 2ke 100, dan pertanyaan tidak menyebutkan input, jadi saya pikir ini adalah versi yang benar
caird coinheringaahing
@dylnan Tantangannya meminta untuk output funtuk n=2ke n=100, bukan hanya satu nilai.
Simply Beautiful Art
Anda benar, saya telah membaca permulaan tantangan dan tidak membaca bagian peraturan dengan jelas
dylnan
Dan berkaitan dengan kode, apakah mungkin untuk digunakan #dalam kasus ini? Sesuatu seperti ini (yang jelas tidak berfungsi tetapi ditulis oleh seseorang yang memahami sintaksisnya dengan jelas!)
dylnan
@dylnan Mungkin, tetapi saat kami membuat daftar tetap, untuk diterapkan pada setiap elemen, biasanya lebih baik daripada #.
caird coinheringaahing
6

APL (Dyalog) , 50 29 25 byte

Lihat bu, tidak ada built-in totient!

4 byte disimpan berkat @ H.PWiz

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

Cobalah online!

Bagaimana?

Rupanya saya pergi untuk formula yang lebih panjang (dan lebih sulit) pertama. Lihat riwayat revisi.

⍳⍵- 1untukn

⍵∨ - gcd dengan n

1= - sama dengan 1?

+/ - jumlah semuanya

Ini adalah totient. Semua sisanya adalah pembungkus untuk penghitungan ( 1+∇) dan menerapkan pada rentang 2..100( ¨1+⍳99).

Uriel
sumber
5

Mathematica, 44 byte

(i=-1;#+1//.x_:>EulerPhi[++i;x];i)&~Array~99

-10 byte dari @Misha Lavrov
-2 byte dari @ user202729

Cobalah online!

J42161217
sumber
4

J REPL, 23 byte

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

Saya belum memeriksanya, tetapi ini mungkin berfungsi dalam J biasa jika Anda mendefinisikannya sebagai kata benda (Saya menggunakan ini pada ponsel saya di REPL).

Built-in, yo.

Saya akan mengatakan bahwa setidaknya ada 2-3 byte untuk mencukur (off-by-one karena cara a:kerjanya, harus digunakan |sebagai noop, dll).

cole
sumber
1
+/*<:5&p:^:a:2+i.99 untuk 19 byte Cobalah online!
Galen Ivanov
Untuk referensi di masa mendatang, Anda juga dapat menggunakannya "+sebagai ganti "0, sehingga dapat menjadi sama<:#@(5&p:^:a:)"+i.99
Conor O'Brien
2
16 byte dengan+/1<a:5&p:2+i.99
mil
1
@ miles: Bisakah Anda menjelaskan penggunaan a:kode Anda? Bagaimana cara kerjanya ^:?
Galen Ivanov
1
@GalenIvanov (5&p:)^:a: mdapat dilakukan dengan a: 5&p: mmenggunakan definisi lain tentang &kapan angka dua diikat dengan kata benda dan kemudian disebut secara dyadically.
miles
4

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

Hard-coding mungkin lebih pendek, tetapi mari kita coba pendekatan matematika murni.

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

Arnauld
sumber
Hard-coding adalah 90 byte ( tautan pastebin )
Herman L
@HermanLauenstein Bagus sekali.
Arnauld
3

Python 2 , 82 byte

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

Cobalah online!

Ini menggunakan pengamatan bahwa:

  • f(a*b) = f(a) + f(b) - 1, kecuali -1dihilangkan jika adan bkeduanya sama
  • f(p) = f(p-1) + 1kapan pprima, denganf(2)=1

Ini menyiratkan bahwa jika nmemiliki faktorisasi utama n = 2**a * 3**b * 5**c * 7**d * 11**e * ..., maka f(n) = max(a,1) + b + 2*c + 2*d + 3*e + ..., di mana masing-masingp>2 dalam faktorisasi berkontribusi f(p-1).

Saya tidak yakin apakah ini terus bertahan n=100, tetapi jika ya, mereka memberikan cara untuk mendefinisikan dan menghitung ftanpa menggunakan φ.

Tidak
sumber
2

Bubblegum , 49 byte

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                                       +

Cobalah online!

ovs
sumber
2

PowerShell , 110 byte

$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)}

Cobalah online!

Pendekatan matematis.

Sebenarnya, melihat melalui itu, sangat mirip dengan jawaban C , tetapi dikembangkan secara mandiri. Buat array 0s, loop dari 2ke 100, lalu hitung phimenggunakan gcdformulasi. Bagian dalam parens pada akhirnya menyimpan hasilnya ke $auntuk putaran berikutnya, dan menempatkan salinan pada pipa, yang menghasilkan output implisit.


PowerShell, 112 byte

"122323333434344534444545444545555545455645555655565646555656556656665656565656656757566756666667566"-split'(.)'

Cobalah online!

Kode-keras. Ho-hum. Lebih pendek dari saya bisa mendapatkan pendekatan matematika sekitar 10-15 byte.

AdmBorkBork
sumber
Saya ingin tahu apakah Anda benar-benar membutuhkan pemisah, karena semua angka adalah satu digit :)
flawr
1
Bisakah Anda menunjukkan kepada kami pendekatan matematis Anda? Kelihatannya jauh lebih menarik: P
Conor O'Brien
2
@ ConorO'Brien Untungnya, saya bisa melihatnya dengan mata segar pagi ini dan golf pendekatan matematis di bawah pendekatan hard-coded.
AdmBorkBork
2

Python 2 , 83 byte

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

Cobalah online!

Menggabungkan estimasi heuristik dengan konstanta hardcoded yang mengoreksi setiap estimasi sebagai salah satu -0atau -1.

Tidak
sumber
2

Sekam , 10 17 byte

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

Cobalah online!

Sunting : +7 byte untuk benar-benar memetakan fungsi pada rentang yang diminta, sebelum itu hanya fungsi komputasi A003434 .

Penjelasan

Hitung berikut 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

Bagian ini m(....)ḣ100hanya memetakan fungsi tersebut pada rentang [2..100], tidak yakin bagaimana saya melewatkan bagian itu sebelumnya: S

ბიმო
sumber
1

PHP, 98 byte

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

Cobalah online!

Saya mengemas semua digit menjadi string biner. Setelah membongkar, mengubahnya menjadi sebuah array dan kemudian menggabungkan array lagi, saya hanya perlu menambahkan 1,2 dan menambahkan 6 karena tidak akan cocok atau menyebabkan kode kontrol muncul.

RFSnake
sumber
1

Perl 6 , 47 byte

map {($_,{+grep 1==* gcd $_,^$_}...1)-1},2..200

Cobalah online!

Sean
sumber
1

05AB1E , 11 byte

тL¦ε[DNs#sÕ

Cobalah online!

Penjelasan

т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
Emigna
sumber
1

C, 112 byte

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--);}

Tidak Disatukan:

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
    }
}

Cobalah online!

Colera Su
sumber
0

Alumin , 87 byte

hhhhhdadtqdhcpkkmzyhqkhwzydqhhwdrdhhhwrysrshhwqdrybpkshehhhwrysrarhcpkksyhaydhehycpkkmr

Cobalah online!

Penjelasan

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
Conor O'Brien
sumber
0

Pyth, 38 byte (tidak kompetitif)

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

Cobalah di Pyth Herokuapp , karena itu tidak berfungsi pada TIO untuk alasan apa pun.

Saya tidak ragu solusi Pyth eksplisit lebih kecil, tetapi saya ingin melihat seberapa kecil saya bisa mendapatkan kode dengan mengompresi urutan, dan belajar Pyth kurasa. Ini menggunakan fakta bahwa batas atas dari urutan adalah log2(n)+1.

Penjelasan

.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

Saya mendapat string terkompresi melalui Ci_.e+1-sl+1ksb"122323333434344534444545444545555545455645555655565646555656556656665656565656656757566756666667566"3, yang merupakan kebalikan dari kode di atas dengan beberapa jenis konversi.

stellatedHexahedron
sumber
1
Mengapa tidak bersaing?
Simply Beautiful Art
@SimplyBeautifulArt tidak benar-benar berarti tidak bersaing dalam arti formal; mengedit judul untuk membuatnya lebih jelas
Hahahedron
0

Ohm v2 , 41 byte

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

Cobalah online!

Secara harfiah sepenuhnya dikodekan ... Saya benar-benar mengambil urutan di atas, menanggalkan semua yang bukan angka, menafsirkannya sebagai basis 8, kemudian mengubahnya menjadi representasi 255 nomor basis built-in Ohm. Itulah yang dilakukan kutipan. Kemudian, program hanya mengubahnya menjadi basis 8 lagi.

ThePlasmaRailgun
sumber