Séquence phi itérée

13

Connexes: fonction phi (n) itérée .

Votre défi est de calculer la fonction phi itérée:

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

φest la fonction totiente d'Euler .

OEIS connexe .

En voici le graphique:

enter image description here


Règles:

Votre objectif est de sortir f(n)de n=2à n=100.

C'est le code-golf, donc le code le plus court l'emporte.

Voici les valeurs que vous pouvez vérifier:

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
Art tout simplement magnifique
la source
@LuisMendo Correction, et également ajouté des valeurs de graphique + pour vérifier. :-)
Simply Beautiful Art
1
J'ai édité dans la balise kolmogorov-complexité , car cela
génère
1
@SimplyBeautifulArt Tout d'abord, prouvez qu'il existe un nombre fini de valeurs xtelles que phi(x)c'est un nombre fixe particulier.
user202729
2
C'est un beau défi, mais je pense qu'il serait préférable de simplement demander une solution à mettre en œuvre f(n) , plutôt que de l'exécuter sur une plage de nombres fixes. Cela fait également une différence entre les langages avec la possibilité d'appliquer des fonctions sur des plages avec moins d'octets (défi en partie de caméléon?)
Uriel
1
: P Voulez-vous dire que je devrais changer le défi pour vous donner un avantage? Quelle que soit la façon dont ces règles sont énoncées, certaines langues auront un avantage et d'autres non. @Uriel
Simply Beautiful Art

Réponses:

10

Haskell , 53 52 octets

Merci nimi d'avoir sauvé 1 octet!

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

Essayez-le en ligne!

sum[1|1<-gcd n<$>[1..n]]donne φ(n)(Tiré de flawr , merci!)

f est une fonction récursive qui calcule 1+φ(n) si n ne l'est pas 1et renvoie 0si elle l' nest 1, car il n'y a plus d'itérations à effectuer pour atteindre1

f<$>[2..100]Crée enfin une liste def appliqués à chaque élément de[2..100]

H.PWiz
la source
7

Haskell , 70 69 68 octets

La fonction (\n->sum[1|1<-gcd n<$>[1..n]]) est la fonction totiente, que nous appliquons à plusieurs reprises dans la fonction anonyme. Merci @laikoni pour -1 octet!

EDIT: Je viens de découvrir que @xnor a utilisé cette fonction de totient exacte dans un défi précédent .

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

Essayez-le en ligne!

flawr
la source
1
C'est assez court pour ne pas avoir de fonction intégrée de totient!
Luis Mendo
1
@LuisMendo H.PWiz a trouvé une solution encore plus courte !
flawr
7

MATL , 16 15 octets

99:Q"@`_Zptq}x@

Essayez-le en ligne!

Explication

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)

Ancienne version, 16 octets

99:Qt"t_Zp]v&X<q

Essayez-le en ligne!

Explication

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
la source
1
Les valeurs produites sont décalées d'une unité, je pense Essayez-le en ligne! corrige cela (mais je n'ai jamais utilisé MATL auparavant donc ...)
caird coinheringaahing
Vérifiez la fin de mon message. Il fournit la sortie attendue, à laquelle vous êtes éteint d'un par chacun.
Simply Beautiful Art
Les 5 premières valeurs générées par votre réponse actuelle sont 2 3 3 4 3, lorsque le défi dit qu'elles devraient l'être1 2 2 3 2
Cairn Coinheringaahing
@cairdcoinheringaahing et SimplyBeautifulArt Ah, je vois. Merci! Corrigé maintenant
Luis Mendo
6

Gelée , 12 11 10 9 octets

³ḊÆṪÐĿ>1S

Essayez-le en ligne!

-1 octet grâce à HyperNeutrino!

-1 octet merci à M. Xcoder!

-1 octet grâce à Dennis

Comment ça fonctionne

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

Comme cela a été fait par Dennis, je (naturellement) ne sais pas pourquoi cela fonctionne, juste que cela fonctionne.

caird coinheringaahing
la source
1
Toutes les sorties @dylnan trois réponses la liste des f(n)de 2à 100, et la question ne mentionne pas l' entrée, donc je pense que c'est la version correcte
Caird coinheringaahing
@dylnan Le défi demande à la sortie fde n=2la n=100, non seulement une valeur.
art tout simplement magnifique
Tu as raison, j'avais lu le début du défi et je n'ai pas lu clairement les règles
Dylnan
Et en ce qui concerne le code, serait-il possible d'utiliser #dans ce cas? Quelque chose comme ça (qui ne fonctionne clairement pas mais écrit par quelqu'un qui comprend clairement la syntaxe!)
dylnan
@dylnan Peut-être, mais comme nous générons une liste fixe, à appliquer sur chaque élément, c'est généralement mieux que #.
caird coinheringaahing
6

APL (Dyalog) , 50 29 25 octets

Regardez-moi, pas de totient intégré!

4 octets enregistrés grâce à @ H.PWiz

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

Essayez-le en ligne!

Comment?

Apparemment, j'ai d'abord opté pour la formule totiente la plus longue (et la plus difficile). Voir l'historique des révisions.

⍳⍵- 1àn

⍵∨ - gcd avec n

1= - égal à 1?

+/ - résume-les tous

Ceci est le totient. Tout le reste est enveloppant pour le comptage ( 1+∇) et l'application sur la plage 2..100( ¨1+⍳99).

Uriel
la source
5

Mathematica, 44 octets

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

-10 octets de @Misha Lavrov
-2 octets de @ user202729

Essayez-le en ligne!

J42161217
la source
4

J REPL, 23 octets

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

Je n'ai pas vérifié, mais cela fonctionne probablement en J régulier si vous le définissez comme un nom (j'ai joué au golf sur mon téléphone sur le REPL).

Intégrés, yo.

Je dirais qu'il y a au moins 2-3 octets à raser (off-by-one à cause de la façon dont a:fonctionne, devoir utiliser |comme noop, etc.).

cole
la source
1
+/*<:5&p:^:a:2+i.99 pour 19 octets Essayez-le en ligne!
Galen Ivanov
Pour référence future, vous pouvez également utiliser "+au lieu de "0, de sorte qu'il pourrait également devenir<:#@(5&p:^:a:)"+i.99
Conor O'Brien
2
16 octets avec+/1<a:5&p:2+i.99
miles
1
@ miles: pouvez-vous expliquer l'utilisation de a:dans votre code? Comment ça marche au lieu de ^:?
Galen Ivanov
1
@GalenIvanov (5&p:)^:a: mpeut être fait en a: 5&p: mutilisant l'autre définition du &moment où une dyade est liée à un nom, puis appelée dyadiquement.
miles
4

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

Le codage en dur peut être plus court, mais essayons une approche purement mathématique.

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
la source
Le codage en dur est de 90 octets ( lien pastebin )
Herman L
@HermanLauenstein Bien joué.
Arnauld
3

Python 2 , 82 octets

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

Essayez-le en ligne!

Il utilise les observations qui:

  • f(a*b) = f(a) + f(b) - 1, sauf que -1est omis si aet bsont tous deux pairs
  • f(p) = f(p-1) + 1quand pest premier, avecf(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 φ.

xnor
la source
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!

ovs
la source
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!

Mathematical approach.

Actually, looking through it, very similar to the C answer, but developed independently. Creates an array of 0s, loops from 2 to 100, then calculates phi using the gcd formulation. The part in parens at the end both saves the result into $a for the next go-round, and places a copy on the pipeline, which results in the implicit output.


PowerShell, 112 bytes

"122323333434344534444545444545555545455645555655565646555656556656665656565656656757566756666667566"-split'(.)'

Try it online!

Hard-coded. Ho-hum. Shorter than I could get a mathematical approach by about 10-15 bytes.

AdmBorkBork
la source
I wonder whether you actually need a separator, as all the numbers are single digits:)
flawr
1
Can you show us your mathematical approach? It looks much more interesting certainly :P
Conor O'Brien
2
@ConorO'Brien Luckily enough, I was able to look at it with fresh eyes this morning and golf the mathematical approach below the hard-coded approach.
AdmBorkBork
2

Python 2, 83 bytes

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

Try it online!

Combines a heuristic estimate with a hardcoded constant that corrects each estimate as either -0 or -1.

xnor
la source
2

Husk, 10 17 bytes

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

Try it online!

Edit: +7 bytes for actually mapping the function over the range that was asked for, before it was only the function computing A003434.

Explanation

The following computes 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

The m(....)ḣ100 part just map that function over the range [2..100], not sure how I missed that part before :S

ბიმო
la source
1

PHP, 98 bytes

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

Try it online!

I packed all digits into a binary string. After unpacking it, converting it to a an array and then mergin the array again, i only had to prepend the 1,2 and append the 6 as those wouldnt fit or caused a control code to appear.

RFSnake
la source
1

Perl 6, 47 bytes

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

Try it online!

Sean
la source
1

05AB1E, 11 bytes

тL¦ε[DNs#sÕ

Try it online!

Explanation

т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
la source
1

C, 112 bytes

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

Try it online!

Colera Su
la source
0

Alumin, 87 bytes

hhhhhdadtqdhcpkkmzyhqkhwzydqhhwdrdhhhwrysrshhwqdrybpkshehhhwrysrarhcpkksyhaydhehycpkkmr

Try it online!

Explanation

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
la source
0

Pyth, 38 bytes (not competitive)

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

Try it on the Pyth Herokuapp, because it doesn't work on TIO for whatever reason.

I have no doubt the explicit Pyth solution is smaller, but I wanted to see how small I could get the code by compressing the sequence, and learn Pyth I guess. This uses the fact that an upper bound of the sequence is log2(n)+1.

Explanation

.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

I got the compressed string via Ci_.e+1-sl+1ksb"122323333434344534444545444545555545455645555655565646555656556656665656565656656757566756666667566"3, which is just the opposite of the code above with a few type conversions.

stellatedHexahedron
la source
1
Why noncompeting?
Simply Beautiful Art
@SimplyBeautifulArt didn't really mean noncompeting in the formal sense; edited the title to make that more clear
stellatedHexahedron
0

Ohm v2, 41 bytes

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

Try it online!

Literally completely hardcoded... I actually took the sequence above, stripped everything that wasn't a number, interpreted it as base 8, then turned it into Ohm's built-in base 255 number representation. That's what the quotes do. Then, the program simply turns that into base 8 again.

ThePlasmaRailgun
la source