Số có thể đạt được


14

Các định nghĩa

  • Euler Phi Function (AKA chức năng hàm Ơ-le ): một chức năng mà mất trong một số dương và trả về số lượng các số dương nhỏ hơn số lượng nhất định mà là đồng thủ với số lượng nhất định. Nó được ký hiệu là φ(n).

  • Số có thể truy cập : nếu tồn tại một số nguyên dương xnhư vậy φ(x) == n, sau đó ncó thể truy cập .

Bài tập

Viết hàm / chương trình để xác định xem một số nguyên dương đã cho có thể truy cập được không.

Đầu vào

Một số tích cực, trong bất kỳ định dạng hợp lý. Người ta có thể cho rằng con số nằm trong khả năng của ngôn ngữ. Đầu vào unary được chấp nhận.

Đầu ra

Hai giá trị nhất quán, một cho các số có thể truy cập và một cho các số không thể truy cập. Hai giá trị có thể là bất cứ điều gì, miễn là chúng phù hợp.

Tủ thử

Các số có thể truy cập dưới 100đây là:

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

( A002202 trên OEIS)

Quy tắc

Tiêu chuẩn áp dụng.

Tiêu chí chiến thắng

Đây là . Đệ trình với số lần đếm byte thấp nhất.

Người giới thiệu


cũng có liên quan: oeis.org/A264739
Lemon

1
Tôi cung cấp tiền thưởng cho câu trả lời Retina một dòng, trong đó một dòng là regex đơn giản (không có backticks).
Leaky Nun

@LeakyNun Tôi hơi bối rối, cho đến nay tôi hiểu rằng phi(n) = count { m : 1 <= m <= n AND (m,n) are coprime }.. điều đó có đúng không?
Khaled.K

@ Khaled.K vâng, đó là sự thật.
Nữ tu rò rỉ

Câu trả lời:


6

Thạch , 7 6 byte

²RÆṪe@

Không chính xác nhanh. Trả về 1 hoặc 0 .

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Làm thế nào nó hoạt động?
Leaky Nun

1
Lực lượng vũ phu. Có giới hạn thấp hơn cho hàm toàn bộ, do đó, đủ để có một phạm vi đủ lớn, toàn bộ bản đồ và kiểm tra sự xuất hiện của đầu vào.
Dennis

Bạn có thể chứng minh rằng căn bậc hai là tối thiểu?
Leaky Nun

Căn bậc hai thực sự không phải là giới hạn dưới, nhưng căn bậc hai chia cho sqrt (2) là. Tôi khẳng định rằng việc nhân đôi là không bắt buộc, nhưng một bằng chứng sẽ phải đợi cho đến khi tôi ngủ được. Quá mệt mỏi ngay bây giờ.
Dennis

4
@LeakyNun Trên thực tế, bổ đề 3 của bài viết này chứng minh rằng căn bậc hai là giới hạn dưới trừ khi n = 2k với k lẻ . Vì k2k có cùng một tổng, nên không cần nhân đôi.
Dennis

6

Toán học, 28 byte

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

Giống như câu trả lời Jelly của Dennis, chúng tôi tính toán các giá trị of của tất cả các số cho đến bình phương của đầu vào và xem liệu đầu vào có xuất hiện ở đó không. Trả về Falsenếu có thể truy cập đầu vào và Truenếu không. Đúng, thật khó hiểu. Nhưng FreeQlà một byte ngắn hơn MatchQ, và hey, thông số kỹ thuật cho biết hai giá trị nhất quán> :)


2

JavaScript (ES6), 90 82 byte

Trả về 0hoặc true.

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

Điều này dựa trên giả định rằng nếu x tồn tại thì x ≤ 2n . Nếu được chứng minh là sai, điều này nên được cập nhật để sử dụng x=n*nthay vì x=n*2(cùng kích thước, chậm hơn nhiều).

Một trường hợp cạnh là n = 128 yêu cầu tính ϕ (255) .

Bản giới thiệu


Thuận các số nguyên tố Fermat đều hiến tăng liên tiếp với các trường hợp cạnh liên tiếp n=2, n=8, n=128, n=32768n=2147483648.
Neil

1

Tiên đề, 56 byte

f(x:PI):Boolean==member?(x,[eulerPhi(i)for i in 1..2*x])

tôi không biết có đúng không ... mã kiểm tra và kết quả

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

Phạm vi 1 .. (2 * x) sẽ ổn cho đến khi đầu vào x = 500 ...




0

05AB1E , 13 12 byte

EDIT : Đã lưu một byte vì đầu vào được sử dụng lại nếu ngăn xếp không có đủ các phần tử.

Đầu ra 1 nếu có thể truy cập, 0 nếu không.

Dựa vào giả định rằng x ≤ 2n nếu nó tồn tại.

xGNÕQi1,q}}0

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

              # 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 byte

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

Thử trực tuyến

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.