สูตรทดสอบเบื้องต้น


30

เป้าหมายของคุณคือการตรวจสอบว่าตัวเลขที่กำหนดnเป็นจำนวนเฉพาะในไบต์ที่น้อยที่สุดหรือไม่ แต่รหัสของคุณจะต้องเป็นนิพจน์Python 2เดียวสำหรับตัวเลขที่ประกอบด้วยเท่านั้น

  • ผู้ประกอบการ
  • ตัวแปรอินพุต n
  • ค่าคงที่จำนวนเต็ม
  • วงเล็บ

ไม่มีลูปไม่มีการมอบหมายไม่มีฟังก์ชั่นในตัวเฉพาะสิ่งที่ระบุไว้ข้างต้น ใช่มันเป็นไปได้

ผู้ประกอบการ

นี่คือรายการของตัวดำเนินการทั้งหมดใน Python 2ซึ่งรวมถึงตัวดำเนินการทางคณิตศาสตร์บิตและตรรกะ:

+    adddition
-    minus or unary negation
*    multiplication
**   exponentiation, only with non-negative exponent
/    floor division
%    modulo
<<   bit shift left
>>   bit shift right
&    bitwise and
|    bitwise or
^    bitwise xor
~    bitwise not
<    less than
>    greater than
<=   less than or equals
>=   greater than or equals
==   equals
!=   does not equal

ค่ากลางทั้งหมดเป็นจำนวนเต็ม (หรือเท็จ / จริงซึ่งโดยนัยเท่ากับ 0 และ 1) การยกกำลังอาจไม่สามารถใช้ร่วมกับเลขชี้กำลังเป็นค่าลบได้เนื่องจากอาจทำให้เกิดการลอยได้ โปรดทราบว่า/การแบ่งพื้นไม่เหมือนกับ Python 3 ดังนั้นจึง//ไม่จำเป็น

แม้ว่าคุณจะไม่คุ้นเคยกับ Python ตัวดำเนินการควรจะเข้าใจได้ง่าย ดูตารางนี้สำหรับความสำคัญของโอเปอเรเตอร์และส่วนนี้และด้านล่างสำหรับข้อกำหนดรายละเอียดของไวยากรณ์ คุณสามารถเรียกใช้งูหลาม 2 TIO

I / O

อินพุต:จำนวนเต็มบวกnที่อย่างน้อย 2

เอาต์พุต: 1 ถ้าnเป็นจำนวนเฉพาะและ 0 เป็นอย่างอื่น TrueและFalseอาจใช้ ไบต์ที่น้อยที่สุดจะเป็นผู้ชนะ

เนื่องจากรหัสของคุณเป็นนิพจน์มันจะเป็นข้อมูลโค้ดโดยคาดว่าค่าอินพุตจะถูกเก็บไว้เป็นnและประเมินผลลัพธ์ที่ต้องการ

รหัสของคุณจะต้องใช้งานได้สำหรับnระบบที่ใหญ่และ จำกัด เนื่องจากชนิดจำนวนเต็มของ Python นั้นไม่มีขอบเขตจึงไม่มีข้อ จำกัด เกี่ยวกับตัวดำเนินการ รหัสของคุณอาจใช้เวลานาน


บางทีนี่ควรจะมีแท็กหลาม?
fəˈnɛtɪk

คำตอบ:


35

43 ไบต์

(4**n+1)**n%4**n**2/n&2**(2*n*n+n)/-~2**n<1

ลองออนไลน์!

วิธีนี้คล้ายกับคำตอบที่สอง (ถูกลบ) ของเดนนิส แต่คำตอบนี้ง่ายกว่าที่จะพิสูจน์ว่าถูกต้อง

พิสูจน์

แบบสั้น

ตัวเลขที่สำคัญที่สุดของ(4**n+1)**n%4**n**2ในฐานที่ไม่หารด้วยnจะทำให้หลักถัดไป (สำคัญน้อยกว่า) เป็นศูนย์ (ถ้า "เลขตัวถัดไป" ไม่ได้อยู่ในส่วนที่เป็นเศษส่วน) จากนั้นbitmask จะถูกดำเนินการเพื่อตรวจสอบ หากตัวเลขใด ๆ ที่ตำแหน่งคี่เป็นศูนย์2nn(4**n+1)**n%4**n**2/n&2**(2*n*n+n)/-~2**n

แบบยาว

Let เป็นจำนวนที่มีฐานตัวแทนคือn n + + 1 1 + 0 0และฉันจะเป็นหลักที่ " ตำแหน่ง " iในการแทนฐานb[an,...,a1,a0]ann++a11+a00aผมผม

  • 2 ** (2 * * * * * * * * n + n n) / - ~ 2 ** n=2(2n+1)n1+2n=4n2×2n1+2n=(4n2-1)×2n1+2n+2n1+2n

เพราะ(ด้วยn2n-1s) เป็นจำนวนเต็มและ2n2n×4n2-11+2n=2n(2n-1)×(4n)n-14n-1=[2n-1,0,2n-1,0,2n-1,0]2nn 2n-1, =[2n-1,0,2n-1,0,2n-1,0]2n2n1+2n=02**(2*n*n+n)/-~2**n[2n-1,0,2n-1,0,2n-1,0]2n

ถัดไปให้พิจารณา

(4 ** 1 + n) ** n=(4n+1)n=(n0)40n+(n1)41n++(nn)4n2=[(nn),0,...,0,(n1),0,(n0)]2n

ดังนั้นจะตัดทอนตัวเลขเป็น 2 nหลักสุดท้าย - ซึ่งไม่รวม ( n4n2=(2n)2n%4**n**22n (ซึ่งคือ 1) แต่รวมสัมประสิทธิ์ทวินามอื่น ๆ ทั้งหมด(nn)

เกี่ยวกับ/n:

  • ถ้าเป็นจำนวนเฉพาะผลลัพธ์จะเป็น[ ( nn. ตัวเลขทั้งหมดที่ตำแหน่งคี่เป็นศูนย์[(nn-1)/n,0,,0,(n1)/n,0,0]2n

  • ถ้าไม่ใช่ค่าเฉพาะ:n

    ให้เป็นที่ใหญ่ที่สุดจำนวนเต็มเช่นว่าn ( na () เขียนเงินปันผลเป็นn(na)n>a>0

    [(nn-1),0,(nn-2),0,...,(na+1),0,0,0,...,0,0,0]2n+[(na),0,(na-1),0,...,(n0)]2n

    การสรุปครั้งแรกมีตัวเลขทั้งหมดหารด้วยและตัวเลขที่ตำแหน่งศูนย์2 a - 1n2a-1

    summand ที่สองมีตัวเลขที่สำคัญที่สุด (ที่ตำแหน่ง ) ไม่สามารถหารด้วยและ (ฐาน)ดังนั้นหารด้วยหารด้วยจะมีตัวเลขที่ตำแหน่งไม่ใช่ศูนย์n 2 n > n n 2 a - 12an2n>nn2a1

    ดังนั้นผลลัพธ์สุดท้าย ( (4**n+1)**n%4**n**2/n) ควรมีตัวเลข (ฐาน , แน่นอน) ที่ตำแหน่ง2 a + 1 ที่ไม่ใช่ศูนย์2n2a+1

สุดท้ายค่าที่เหมาะสมและ ( &) ดำเนินการบิต vectorized และในตัวเลขในฐาน (เพราะฐานเป็นอำนาจของ 2) และเพราะ& 0 = 0 , และ ( 2 n - 1 ) =ทั้งหมด0 < 2 n , เป็นศูนย์ IFF ได้ตัวเลขทั้งหมดในครั้งแรกnตำแหน่งคี่เป็นศูนย์ - ซึ่งเทียบเท่ากับnเป็นนายก2na&0=0,a&(2n1)=a0a<2n(4**n+1)**n%4**n**2/n&2**(2*n*n+n)/-~2**n(4**n+1)**n%4**n**2/nnn


2
จะ(4**n+1)**n%2**n**2/n&2**n**2/-~2**n<1ทำงานอย่างไร
Dennis

11
ถ้าง่ายต่อการพิสูจน์ความถูกต้องคุณสามารถรวมหลักฐานไว้ในคำตอบได้หรือไม่? เรามี MathJax ในขณะนี้จึงเป็นเรื่องง่ายที่จะทำให้หลักฐานอันชัดเจนและผมก็ไม่สามารถดูเหตุผลที่ชัดเจนสำหรับการแบ่งโดยไม่ก่อให้เกิดการมีปฏิสัมพันธ์ที่ไม่พึงประสงค์ระหว่างฐานตัวเลขn 4**n
Peter Taylor

3
"ฉันได้ค้นพบหลักฐานที่น่าทึ่งอย่างแท้จริงของคำตอบนี้ซึ่งความคิดเห็นนี้มีขนาดเล็กเกินกว่าที่จะบรรจุ ... "
Digital Trauma

1
ข้อเสนอแนะสำหรับการทำให้หลักฐานสั้นลงยินดีต้อนรับ
user202729

1
ทำได้ดีมาก! นี่เป็นวิธีเดียวกับที่ฉันคิดขึ้นมา (4**n+1)**n%4**n**2/n<<n&4**n**2/-~2**n<1ผมพบว่าคู่ของไบต์สามารถตัดกับ ฉันสงสัยว่าความท้าทายนี้เป็นไปได้หรือไม่หากไม่มีตัวดำเนินการระดับบิต
xnor

6

Python 2 , 56 ไบต์

n**(n*n-n)/(((2**n**n+1)**n**n>>n**n*~-n)%2**n**n)%n>n-2

ลองออนไลน์!

นี่คือหลักฐานของแนวคิดที่ท้าทายนี้เป็น doable กับผู้ประกอบการทางคณิตศาสตร์เท่านั้นโดยเฉพาะอย่างยิ่งโดยไม่ต้องบิต|, หรือ& ^รหัสใช้ตัวดำเนินการระดับบิตและการเปรียบเทียบสำหรับการเล่นกอล์ฟเท่านั้นและสามารถแทนที่ได้อย่างง่ายดายด้วยการเทียบเท่าเลขคณิต

อย่างไรก็ตามการแก้ปัญหาคือช้ามากและฉันยังไม่ได้สามารถที่จะเรียกใช้ `ขอบคุณเลขยกกำลังสองระดับเช่น2 n nn=62nn

ความคิดหลักคือการแสดงออกสำหรับแฟคทอเรียลซึ่งช่วยให้เราทำการทดสอบทฤษฎีบทของวิลสัน( n - 1 ) ! % n > n - 2โดยที่%เป็นตัวดำเนินการโมดูโลn!(n-1)!%n>n-2%

เราสามารถสร้างนิพจน์สำหรับสัมประสิทธิ์ทวินามซึ่งทำจากแฟคทอเรียล

(ม.n) =ม.!n!(ม.-n)!

แต่มันไม่ชัดเจนว่าจะดึงแฟคทอเรียลเพียงหนึ่งในนี้ออกมาได้อย่างไร เคล็ดลับคือการทุบออกจากกันด้วยการทำให้m มีขนาดใหญ่มากn!ม.

(ม.n) =ม.(ม.-1)(ม.-n+1)n!=ม.nn!(1-1ม.)(1-2ม.)(1-n-1ม.)

ดังนั้นถ้าเราให้เป็นผลคูณ( 1 - 1)เรามี(1-1ม.)(1-2ม.)(1-n-1ม.)

n!=ม.n(ม.n)

ถ้าเราไม่สนใจเราก็เสร็จแล้ว ส่วนที่เหลือของโพสต์นี้จะดูว่าเราต้องทำให้mมีขนาดใหญ่เพื่อให้สามารถทำเช่นนี้ได้cm

โปรดทราบว่าเข้าใกล้1จากด้านล่างเป็นเมตร→การ เราแค่ต้องทำให้m มีขนาดใหญ่พอที่ตัดcให้ค่ากับจำนวนเต็มส่วนn ! เพื่อเราจะคำนวณc1mmcn!

n!=mn(mn)

สำหรับสิ่งนี้มันพอเพียงที่จะมีเพื่อหลีกเลี่ยงอัตราส่วนที่ผ่านจำนวนเต็มถัดไปn ! + 11c<1/n!n!+1

สังเกตว่าเป็นผลคูณของnเทอมที่เล็กที่สุดคือ( 1 - n - 1cn ) ดังนั้นเรามี(1n1m)

c>(1n1m)n>1n1mn>1n2m,

ซึ่งหมายถึง . เนื่องจากเราต้องการให้มี1-c<1/n! มันพอเพียงที่จะเอาmn! n21c<n2m1c<1/n!mn!n2

ในรหัสที่เราจะใช้ n เนื่องจากทฤษฎีบทของวิลสันใช้( n - 1 ) ! จริง ๆ แล้วเราแค่ต้องการm ( n - 1 ) ! ( n - 1 ) 2 มันเป็นเรื่องง่ายที่จะเห็นว่าม. = n nตอบสนองความผูกพันค่าขนาดเล็กได้อย่างรวดเร็วและเติบโตเกินกว่าด้านขวามือ asymptotically พูดกับการประมาณของสเตอร์ลิงm=nn(n1)!m(n1)!(n1)2m=nn


3

1ผม,J<nผม×J=n

Python 2 มีจำนวนไบต์มากเกินไป (278 ขอบคุณ Jo King ในคอมเม้นท์!)

((((((2**(n*n)/(2**n-1)**2)*(2**((n**2)*n)/(2**(n**2)-1)**2))^((n*((2**(n*n-n)/(2**n-1))*(2**((n**2)*(n-1))/(2**n**2-1))))))-((2**(n*n-n)/(2**n-1))*(2**((n**2)*(n-1))/(2**(n**2)-1))))&(((2**(n*(n-1))/(2**n-1))*(2**((n**2)*(n-1))/(2**(n**2)-1)))*(2**(n-1)))==0))|((1<n<6)&(n!=4))

ลองออนไลน์!

นี่เป็นจำนวนไบต์ที่มากกว่าคำตอบอื่น ๆ ดังนั้นฉันจึงทิ้งมันไว้ตอนนี้ ข้อมูลโค้ดด้านล่างมีฟังก์ชั่นและการกำหนดตัวแปรเพื่อความชัดเจน แต่การแทนที่จะเปลี่ยน isPrime (n) เป็นนิพจน์ Python เดียว

def count(k, spacing):
    return 2**(spacing*(k+1))/(2**spacing - 1)**2
def ones(k, spacing):
    return 2**(spacing*k)/(2**spacing - 1)

def isPrime(n):
    x = count(n-1, n)
    y = count(n-1, n**2)
    onebits = ones(n-1, n) * ones(n-1, n**2)
    comparison = n*onebits
    difference = (x*y) ^ (comparison)
    differenceMinusOne = difference - onebits
    checkbits = onebits*(2**(n-1))
    return (differenceMinusOne & checkbits == 0 and n>1)or 1<n<6 and n!=4

ทำไมมันทำงาน

ฉันจะทำอัลกอริทึมเดียวกันที่นี่ในฐาน 10 แทนไบนารี ดูเศษส่วนที่ประณีตนี้:

1.09992=1.002003004005...

1015/(9992)=10020030041,2,3,4

สมมุติว่าเราคูณสองตัวเลขเช่นนี้ด้วยระยะห่างระหว่างศูนย์ ฉันจะใส่เครื่องหมายจุลภาคในผลิตภัณฑ์

1002003004×1000000000002000000000003000000000004=
1002003004,002004006008,003006009012,004008012016

005

005005005...005001001001...001d005999d

d900900900900


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