迭代phi序列


13

相关:迭代phi(n)函数

您面临的挑战是计算迭代的phi函数:

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

哪里φ欧拉函数

相关OEIS

这是它的图形:

在此处输入图片说明


规则:

你的目标是输出f(n)n=2n=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固定,还添加了图表和值进行检查。:-)
Simply Beautiful Art

1
我已经编辑了kolmogorov-complexity标签,因为它本质上是输出固定值
Caird coinheringaahing

1
@SimplyBeautifulArt首先证明存在有限个值,x例如phi(x)一个特定的固定数。
user202729

2
这是一个很好的挑战,但是我认为最好是寻求一个解决方案来实现f(n),而不是在一定范围的固定数量上运行它。这也使得能够在较少字节范围内应用函数的语言之间有所区别(部分是变色龙挑战?)
Uriel 2017年

1
:P您是在暗示我应该改变挑战以给您带来优势吗?不管这些规则如何声明,某些语言都将具有优势,而某些语言则不会。@Uriel
Simply Beautiful Art

Answers:


10

Haskell53 52字节

感谢nimi保存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)(摘自fucker,谢谢!)

f是一个递归函数,计算1+φ(n)n是否不是1,并输出0if是否n1,因为不再需要进行迭代1

最后f<$>[2..100]创建一个列表,f应用于每个元素[2..100]


7

Haskell70 69 68字节

该函数(\n->sum[1|1<-gcd n<$>[1..n]])是totient函数,我们在匿名函数中反复应用。感谢@laikoni -1个字节!

编辑:我刚刚发现@xnor在上一个挑战中使用了此确切的totient函数。

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

在线尝试!


1
这是因为没有内置的tant!
Luis Mendo

1
@LuisMendo H.PWiz发现了一个更短的解决方案!
瑕疵

7

MATL16 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

检查我的帖子的结尾。它提供了预期的输出,每个输出都会使您偏离目标。
Simply Beautiful Art

您当前答案输出的前5个值是2 3 3 4 3,当挑战说应该是的时候1 2 2 3 2
caird coinheringaahing

@cairdcoinheringaahing和SimplyBeautifulArt啊,我知道了。谢谢!已更正
Luis Mendo

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

正如丹尼斯(Dennis)所做的那样,我(可以理解)不知道为什么这样做,只是知道它为什么起作用。


1
@dylnan所有三个答案都输出f(n)2到的列表100,而问题没有提及输入,因此我认为这是正确的版本
caird coinheringaahing

@dylnan的挑战要求输出fn=2n=100,不只是一个值。
Simply Beautiful Art

您是对的,我已经阅读了挑战的开始,并且没有清楚地阅读规则的部分
dylnan

关于代码,是否可以#在这种情况下使用?像这样的东西(显然不起作用,但是是由清楚理解语法的人写的!)
dylnan

@dylnan可能,但是当我们生成固定列表以应用于每个元素时,通常比更好#
caird coinheringaahing

6

APL(Dyalog)50 29 25字节

看,妈,没有内置的tant!

@ H.PWiz节省了4个字节

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

在线尝试!

怎么样?

显然,我首先选择了更长(更难)的上腹式。查看修订历史。

⍳⍵- 1n

⍵∨ -gcd与 n

1= -等于1?

+/ -全部加总

这是汤因。其余的全部用于计数(1+∇)并应用于范围2..100¨1+⍳99)。


5

Mathematica,44个字节

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

来自@Misha Lavrov的-10个
字节来自@ user202729的-2个字节

在线尝试!


4

J REPL,23个字节

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

我没有检查过,但是如果您将其定义为名词,则可能在常规J中有效(我在REPL上通过手机打了高尔夫球)。

内置的哟。

我要说的是至少要刮掉2-3个字节(由于工作方式a:,必须逐一|删除,必须用作noop等)。


1
+/*<:5&p:^:a:2+i.99 为19个字节在线尝试!
Galen Ivanov

供将来参考,您可以使用aso "+代替"0,因此它也可以变成<:#@(5&p:^:a:)"+i.99
Conor O'Brien

2
16字节,含+/1<a:5&p:2+i.99
英里

1
@ miles:您能解释一下a:代码中的用法吗?它是如何工作的^:呢?
Galen Ivanov

1
@GalenIvanov (5&p:)^:a: m可以a: 5&p: m使用另一种定义,&即将双联与名词绑定在一起,然后以双联方式进行调用。
英里

4

JavaScript(ES6),115 ... 104 99字节

硬编码可能会更短一些,但是让我们尝试一种纯粹的数学方法。

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


硬编码为90个字节(pastebin链接
Herman L

@HermanLauenstein很好。
Arnauld


3

Python 2,82字节

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

在线尝试!

这使用了以下观察结果:

  • f(a*b) = f(a) + f(b) - 1,但-1如果ab都为偶数,则省略
  • f(p) = f(p-1) + 1什么时候p是素数f(2)=1

这些暗示如果n有素数分解n = 2**a * 3**b * 5**c * 7**d * 11**e * ...,那么分解f(n) = max(a,1) + b + 2*c + 2*d + 3*e + ...中的每个p>2贡献因子f(p-1)

我不确定这些内容是否会继续保留n=100,但是如果确实存在,它们会提供一种f无需使用即可进行定义和计算的方法φ


2

泡泡糖,49字节

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                                       +

在线尝试!


2

PowerShell,110字节

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

在线尝试!

数学方法。

实际上,翻阅它与C答案非常相似,但是是独立开发的。创建一个0s 数组,从2到循环100,然后phi使用gcd公式进行计算。最后,paren中的部分将结果保存到$a下一个遍历中,并在管道上放置副本,这将导致隐式输出。


PowerShell,112字节

"122323333434344534444545444545555545455645555655565646555656556656665656565656656757566756666667566"-split'(.)'

在线尝试!

硬编码。呜呜 比数学方法要短10-15个字节。


我想知道您是否真的需要分隔符,因为所有数字都是
一位

1
您能告诉我们您的数学方法吗?当然,它看起来更有趣:P
Conor O'Brien

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

在线尝试!

将启发式估算值与硬编码常数相结合,该常数将每个估算值校正为-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,然后添加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--);}

取消高尔夫:

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
为什么不竞争?
Simply Beautiful Art

@SimplyBeautifulArt并不是真正意义上的不竞争。编辑标题以使其更清楚
星状

0

欧姆v2,41个字节

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

在线尝试!

从字面上看完全是硬编码的...实际上,我采用了上面的顺序,剥离了所有不是数字的内容,将其解释为以8为底,然后将其转换为Ohm内置的以255为底的数字表示。那就是引号的作用。然后,该程序只需将其再次转换为基数8。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.