ตัวเลขที่เข้าถึงได้


14

คำนิยาม

  • ฟังก์ชั่นออยเลอร์พี ( ฟังก์ชั่น AKA totient ): ฟังก์ชั่นที่ใช้ในจำนวนบวกและส่งกลับจำนวนของจำนวนบวกน้อยกว่าจำนวนที่กำหนดซึ่งเป็นแบบร่วมเฉพาะกับจำนวนที่กำหนด φ(n)มันจะแสดงเป็น

  • จำนวนเข้าถึงได้ถ้ามีอยู่ในเชิงบวกจำนวนเต็มxเช่นว่าφ(x) == nนั้นnคือสามารถเข้าถึงได้

งาน

เขียนฟังก์ชั่น / โปรแกรมเพื่อตรวจสอบว่าจำนวนเต็มบวกที่กำหนดนั้นสามารถเข้าถึงได้

อินพุต

ตัวเลขบวกในรูปแบบที่สมเหตุสมผล หนึ่งสามารถสันนิษฐานได้ว่าจำนวนอยู่ในความสามารถของภาษา ยอมรับอินพุตแบบยูนารี

เอาท์พุต

ค่าที่สอดคล้องกันสองค่าหนึ่งค่าสำหรับหมายเลขที่เข้าถึงได้และอีกค่าสำหรับหมายเลขที่ไม่สามารถเข้าถึงได้ ค่าสองค่าสามารถเป็นอะไรก็ได้ตราบใดที่มีความสอดคล้องกัน

Testcases

ตะโกนตัวเลขที่สามารถเข้าถึงได้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, 60, 64, 66, 70, 72, 78, 80, 82, 84, 88, 92, 96

( A002202บน OEIS)

กฎระเบียบ

ช่องโหว่มาตรฐานใช้

เกณฑ์การชนะ

นี่คือรหัสกอล์ฟส่งด้วยการชนะนับไบต์ต่ำสุด

อ้างอิง


ที่เกี่ยวข้องเพิ่มเติม: oeis.org/A264739
มะนาวที่ถูกทำลายได้

1
ฉันเสนอเงินรางวัลให้กับคำตอบ Retina หนึ่งบรรทัดโดยที่หนึ่งบรรทัดนั้นเป็น regex ธรรมดา (ไม่มี backticks)
Leun Nun

@LeakyNun ฉันสับสนเล็กน้อยจนถึงตอนนี้ฉันเข้าใจแล้วว่าphi(n) = count { m : 1 <= m <= n AND (m,n) are coprime }.. จริงหรือ
Khaled.K

@ Khaled.K ใช่นั่นเป็นเรื่องจริง
Leun Nun

คำตอบ:


6

เยลลี่ , 7 6 ไบต์

²RÆṪe@

ไม่เร็วอย่างแน่นอน ผลตอบแทนที่1หรือ0

ลองออนไลน์!

มันทำงานอย่างไร

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

มันทำงานยังไง?
Leun Nun

1
กำลังดุร้าย. มีขอบเขตที่ต่ำกว่าสำหรับฟังก์ชั่นโทเค็นดังนั้นจึงเพียงพอที่จะใช้ช่วงที่มีขนาดใหญ่พอแผนที่รวมและตรวจสอบการเกิดขึ้นของอินพุต
Dennis

คุณสามารถพิสูจน์ได้ว่าสแควร์รูทนั้นน้อยที่สุดหรือไม่?
Leun Nun

จริง ๆ แล้วสแควร์รูทไม่ใช่ขอบเขตที่ต่ำกว่า, แต่สแควร์รูทหารด้วย sqrt (2) คือ ฉันมั่นใจว่าไม่จำเป็นต้องเพิ่มเป็นสองเท่า แต่หลักฐานจะต้องรอจนกว่าฉันจะได้นอนบ้าง เหนื่อยเกินไปแล้ว
Dennis

4
@LeakyNun จริงแทรก 3 ของบทความนี้พิสูจน์ให้เห็นว่ารากที่เป็นที่ต่ำกว่าผูกพันเว้นแต่n = 2kกับแปลกk เนื่องจากkและ2kมีจำนวนผลรวมเท่ากันจึงไม่จำเป็นต้องเพิ่มเป็นสองเท่า
Dennis

6

Mathematica ขนาด 28 ไบต์

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

เช่นเดียวกับคำตอบ Jelly ของ Dennis เราคำนวณค่า of ของตัวเลขทั้งหมดจนถึงจตุรัสของอินพุตและดูว่าอินพุตนั้นปรากฏอยู่ในนั้นหรือไม่ ส่งคืน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=2, n=8, n=128, และn=32768 n=2147483648
Neil

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




0

05AB1E , 13 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);
        }
    }
}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.