可达号码


14

定义

  • 欧拉披Euler Phi)函数(又称totient函数):该函数接受一个正数,并返回小于给定数的正数,这些正数与给定数互质。表示为φ(n)

  • 可达数:如果存在一个正整数x,使得φ(x) == n,然后n可到达的

任务

编写函数/程序以确定给定的正整数是否可以达到。

输入值

任何合理格式的正数。可以假定数字在该语言的能力范围内。一元输入被接受。

输出量

两个一致的值,一个用于可访问的数字,另一个用于不可访问的数字。两个值可以是任意值,只要它们是一致的即可。

测试用例

以下是可接通的电话号码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,58, 60、64、66、70、72、78、80、82、84、88、92、96

OEIS上为A002202

规则

有标准漏洞

获奖标准

这是。提交的字节数最少。

参考文献



1
我为单行视网膜答案提供了赏金,其中一行是普通正则表达式(没有反引号)。
Leaky Nun

@LeakyNun我有点困惑,到目前为止,我明白phi(n) = count { m : 1 <= m <= n AND (m,n) are coprime }..是真的吗?
Khaled.K

@ Khaled.K是的,是的。
Leaky Nun

Answers:


6

果冻7 6字节

²RÆṪe@

不太快。返回10

在线尝试!

怎么运行的

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

它是如何工作的?
Leaky Nun

1
蛮力。totient函数有一个下限,因此足以取一个足够大的范围,映射totient并检查是否出现输入。
丹尼斯,

你能证明平方根是最小的吗?
Leaky Nun

平方根实际上不是下限,但是平方根除以sqrt(2)是。我很肯定不需要加倍,但是要等到我入睡后才能证明。现在太累了。
丹尼斯,

4
实际上@LeakyNun,的引理3 本文证明的平方根是一个下界除非N = 2K具有奇数ķ。由于k2k的张力相同,因此不需要加倍。
丹尼斯,

6

Mathematica,28个字节

EulerPhi@Range[#^2]~FreeQ~#&

与Dennis的Jelly答案一样,我们计算所有数字的φ值,直到输入的平方,然后查看输入是否出现在其中。False如果输入可达,True则返回,否则返回。是的,这令人困惑。但是FreeQ比短一个字节MatchQ,嘿,规范说任何两个一致的值> :)


2

JavaScript(ES6),90 82字节

返回0true

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=2n=8n=128n=32768n=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之前都是可以的...



1

05AB1E,5个字节

nLÕså

说明:

n       Square [implicit] input
 L      Range [1 .. a]
  Õ     Euler totient
   s    Put first input at the top of the stack
    å   Is it in the list?

在线尝试!


0

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

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.