ฉันเป็น Pillai คนสำคัญหรือไม่?


14

พีไลที่สำคัญเป็นจำนวนเฉพาะpที่มีอยู่บางส่วนในเชิงบวกmดังกล่าวว่าและเมตร)(m!+1)0(mod p)p1(mod m)

กล่าวอีกนัยหนึ่งจำนวนเต็มคือพิลไตไพร์มถ้ามันเป็นจำนวนเฉพาะถ้ามีจำนวนเต็มบวกเช่นแฟคทอเรียลของบวกหารด้วยและถ้าหารด้วยไม่ได้pmm1pp1m


กำหนดจำนวนเต็มบวกเป็นอินพุตให้ตัดสินว่าเป็นไพรม์พิลไตหรือไม่ ลำดับของจำนวนเฉพาะพีไลเป็นOEIS A063980

ตัวอย่างเช่นเป็น Pillai prime เพราะ:23

  • มันเป็นจำนวนเฉพาะที่มีเพียง 2 ปัจจัย
  • m=14และเป็นไปตามเงื่อนไขด้านบน:และไม่ได้แบ่ง ; และไม่ได้แบ่งอย่างใดอย่างหนึ่ง23 ( 14 ! + 1 ) 14 22 23 ( 18 ! + 1 ) 18 22m=1823(14!+1)142223(18!+1)1822

กรณีทดสอบ

Truthy:

23
59
83
109
139
593

Falsy:

5
7
8
73
89
263
437

สำหรับกรณีที่ truthy ที่เกี่ยวข้อง 's [(23, [14, 18]), (59, [15, 40, 43]), (83, [13, 36, 69]), (109, [86]), (139, [16]), (593, [274])]มี


คุณสามารถปฏิบัติตามมาตรฐาน (นั่นคือ truthy / ค่า falsy) รูปแบบการส่งออกหรือมีค่าที่สอดคล้องกันสำหรับช่วงพีไลและค่าที่ไม่สอดคล้องกันเป็นอย่างอื่นหรือในทางกลับกัน

คุณสามารถแข่งขันในภาษาการเขียนโปรแกรมใด ๆและสามารถรับอินพุตและให้เอาต์พุตผ่านวิธีการมาตรฐานใด ๆในขณะที่รับทราบว่าช่องโหว่เหล่านี้ถูกห้ามโดยค่าเริ่มต้น นี่คือดังนั้นการส่งสั้นที่สุด (เป็นไบต์) สำหรับทุกภาษาที่ชนะ


อินพุตสามารถเป็นจำนวนเต็มคอมโพสิตได้หรือไม่
JungHwan ขั้นต่ำ

@JungHwanMin ใช่อินพุตสามารถเป็นจำนวนเต็มรวมได้
Mr. Xcoder

ฉันแนะนำกรณีทดสอบเช่น 437 ซึ่งเป็นคอมโพสิต แต่หาร 18! +1
Nitrodon

@Nitrodon เพิ่มกรณีทดสอบนั้นขอบคุณ!
Mr. Xcoder

1
@DanielIndie ไป[(23, 14), (23, 18), (59, 15), (59, 40), (59, 43), (83, 13), (83, 36), (83, 69), (109, 86), (139, 16), (593, 274)]เลย: ฉันได้เพิ่มพวกเขาลงในการท้าทายด้วย
Mr. Xcoder

คำตอบ:


9

Python 2 , 115 111 110 109 ไบต์

-6 ไบต์ขอบคุณ Mr. Xcoder

lambda n:n>2and cmp(*map(all,zip(*[[n%x==1or~f(x)%n,n%x]for x in range(2,n)])))<0
f=lambda x:0**x or x*f(x-1)

ลองออนไลน์!

ฟังก์ชั่นประกอบด้วยสองส่วน~-n%x<1or~f(x)%n>0ที่ตรวจสอบว่าn ไม่สอดคล้องกับ "เงื่อนไขพิลไต" และn%x>0สำหรับการตรวจสอบความถูกต้องที่สำคัญ
หลังจากนั้นallถูกนำไปใช้กับรายการทั้งสองรายการแรกจะมีFalse/ 0ถ้ามีเป็นที่ถูกต้อง "จำนวนไล" และที่สองจะมีTrue/ 1ถ้าnเป็นสำคัญ
สิ่งเหล่านี้จะถูกส่งผ่านไปยังcmpสิ่งนั้นจะกลับมา-1ในเกมนี้ (เป็นนายก Pillai ที่ถูกต้อง) ชุดค่าผสมอื่น ๆ[[0, 0], [1, 0], [1, 1]]จะกลับมา0หรือ1


2
+1 อัลกอริทึมที่ฉลาด (และคำอธิบายของพวกเขา) เป็นเหตุผลที่ฉันรัก SE นี้
IanF1

8

เจลลี่ , 11 8 ไบต์

Ṗ!%ẹ’ḍ’E

ส่งคืน0สำหรับ Pillai prime มิฉะนั้นจะเป็น1

ลองออนไลน์!

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

Ṗ!%ẹ’ḍ’E  Main link. Argument: n

Ṗ         Pop; yield [1, ..., n-1].
 !        Take the factorial of each integer.
  %       Take the factorials modulo p.
   ẹ’     Find all indices of n-1.
     ḍ’   Test n-1 for divisibility by each of these indices.
       E  Return 1 if all of the resulting Booleans are equal (all 1 means there is
          no suitable m, all 0 means n is not prime), 0 if they are different.

1
นั่นคือประมาณว่าฉันจะได้ทำมันเกินไป แต่ผมไม่ได้จัดการที่จะพิสูจน์ให้เห็นว่าม. ∈ [1, n)
Erik the Outgolfer

4
ถ้าm ≥ nดังนั้นm! หารด้วยnดังนั้นm! + 1 ≡ 1 (สมัย n)
เดนนิส



3

J , 30 26 ไบต์

-4 ไบต์ขอบคุณ FrownyFrog

1 e.i.((|1+!)~<1~:|)1&p:*]

ลองออนไลน์!

คำอธิบาย:

                        1&p:*]      checks if the number is prime and if not sets it to 0
                   1~:|             checks if p is not 1 mod m
           (|1+!)~                  m factorial plus 1 modulo n
                  <                 are both conditions met?  
       i.                           generates successive m's (a list 0..n-1)
   1 e.                             1's are at the indices of m, so if there's 1 - Pillai

1
ตรวจสอบว่าโมดูโล n น้อยกว่า1~:|การบันทึก 2 ไบต์
FrownyFrog

1
(]|1+!@[)เป็นเพียง(|1+!)~
FrownyFrog

@FrownyFrog - ขอบคุณ! ฉันกำลังคิดเกี่ยวกับ~และมันทำให้รู้สึกกับความคิดเห็นก่อนหน้าของคุณ
Galen Ivanov


2

Python 2 , 109 107 ไบต์

lambda p:any(~-p%m>~l(m)%p<1for m in range(2,p))*all(p%i for i in range(2,p-1))
l=lambda a:0**a or a*l(a-1)

ลองออนไลน์!


คำอธิบาย

lพบว่าปัจจัยของจำนวนผ่านเพื่อให้ผลตอบแทนการป้อนข้อมูล5120

การall(p%i for i in range(2,p-1))ตรวจสอบเพื่อดูว่าตัวเลขนั้นสำคัญหรือไม่เราไม่สนใจ 0 และ 1 เนื่องจากเงื่อนไขอื่น ๆ ของเราได้ตัดกฎเหล่านั้นออกไปแล้ว

ในที่สุดเราใช้any(~-p%m>-~l(m)%p==0for m in range(2,p))ในการย้ำผ่านการมองที่มีศักยภาพทั้งหมดเพื่อดูว่ามีความพึงพอใจตามความต้องการของเราหรือไม่ วิธี~-p p+1จากนั้นเราตรวจสอบเพื่อดูว่ามันมีค่ามากกว่า-~l(m)%p(ซึ่งแปลไป(m!-1)%pแล้วจากนั้นเราเปรียบเทียบมัน0โดยทั่วไป~-p%mจะต้องมากกว่า 0 และ-~l(m)%pต้องเป็น 0


แหล่งที่มา


ปรับปรุง


2

อย่างที่คุณอาจเห็นในลิงค์ของ tio ไม่ใช่ทุกกรณีผ่านไปนั่นเป็นเพราะ js ไม่สามารถจัดการกับตัวเลขขนาดใหญ่ได้หากความต้องการดังกล่าวมีอยู่ไม่ดีลองใช้มัน :)

มีการตรวจสอบอีกครั้งF%n>n-2&(F+1)%n<1เพื่อป้องกันการบวกเท็จ (แต่ไม่ใช่วิธีอื่น ๆ ที่มีปัญหาจำนวนมากของ js เราต้องการ(F+1)%n<1จำนวนที่น้อยลงจริงๆ ซึ่งจะช่วยลดการแก้ปัญหาไบต์ให้เป็น60

JavaScript (Node.js) , 90 88 86 72 68 ไบต์

  • ขอบคุณ Arnauld สำหรับการลดขนาด 1 ไบต์
f=(n,F=i=2,g=0)=>n%i?f(n,F*=++i,g|=F%n>n-2&(F+1)%n<1&~-n%i>0):i==n*g

ลองออนไลน์!


2

Brachylogขนาด 13 ไบต์

>.ḟ+₁ḋ∋?-₁f≡ⁿ

ลองออนไลน์!

ประสบความสำเร็จสำหรับ Pillai เฉพาะกาลให้m ที่เล็กที่สุดผ่านตัวแปรเอาท์พุทและล้มเหลวสำหรับสิ่งอื่นใด เนื่องจากส่วนใหญ่ของวิธีการนี้ช่วยประหยัดไบต์มากกว่าวิธีการแก้ปัญหาของ sundar คือว่ามันคำนวณซ้ำ ๆ ความเป็นจริงที่สำคัญของตัวเลขขนาดใหญ่บางอย่างมันค่อนข้างช้าในการป้อนข้อมูลที่มีขนาดใหญ่ (ฉันอาจเรียกใช้กรณีเหล่านี้ในการติดตั้ง Brachylog ในพื้นที่ของฉันเมื่อแล็ปท็อปของฉันไม่ได้ใช้พลังงานจากแบตเตอรี่)

 .               The output
>                is less than the input,
       ?         the input
      ∋          is an element of
     ḋ           the prime factorization of
 .               the output's
  ḟ              factorial
   +₁            plus one,
           ≡ⁿ    and the output is not an element of
          f      the list of all factors of
       ?         the input
        -₁       minus one.

1

[Perl], 45 ไบต์

use ntheory":all";is_prime($n)&&is_pillai($n)

โมดูลทฤษฎีจำนวนมีเพรดิเคตเป็นฟังก์ชันในตัว (is_pillai ส่งกลับค่า 0 หรือ m ที่เล็กที่สุดดังนั้นจึงแก้ไข A063828 ได้เช่นกัน) รหัส C และ Perl พื้นฐานไม่ได้ถูกนำมาเล่น (แน่นอน) รหัส C ดูเหมือนว่า:

UV pillai_v(UV n) {
  UV v, fac = 5040 % n;
  if (n == 0) return 0;
  for (v = 8; v < n-1 && fac != 0; v++) {
    fac = (n < HALF_WORD) ? (fac*v) % n : mulmod(fac,v,n);
    if (fac == n-1 && (n % v) != 1)
      return v;
  }
  return 0;
}

(แทนที่ยูวีโดยทั่วไปด้วย uint64_t หรือคล้ายกันและ HALF_WORD ตัดสินใจว่าเราสามารถปรับ mulmod ให้เป็นออปติกพื้นฐานแบบธรรมดาได้หรือไม่)

รหัส Perl บริสุทธิ์คล้ายกับ:

sub is_pillai {
  my $p = shift;
  return 0 if $p <= 2;
  my($pm1, $nfac) = ($p-1, 5040 % $p);
  for (my $n = 8; $n < $p; $n++) {
    $nfac = mulmod($nfac, $n, $p);
    return $n if $nfac == $pm1 && ($p % $n) != 1;
  }
  0;
}


1

Whispers v2 , 230 ไบต์

> 1
> Input
>> 1…2
>> L!
>> L+1
>> L∣2
>> L⋅R
>> 2%L
>> Each 4 3
>> Each 5 9
>> Each 6 10
>> Each 7 11 3
> {0}
>> 12∖13
>> Each 8 14
>> L≠1
>> Each 16 15
>> Each 7 17 15
>> 18∖13
>> [19]
>> 2’
>> 21⋅20
>> Output 22

ลองออนไลน์!

ส่งคืนรายการว่างสำหรับช่วงเวลาที่ไม่ใช่ Pillai และรายการที่ไม่ว่างเปล่าเป็นอย่างอื่น

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

เสียงกระซิบถูกออกแบบมาเพื่อจัดการกับตัวเลขจริง / ซับซ้อนโดยมีคำสั่งอาร์เรย์เพิ่มขึ้นเล็กน้อยเพื่อการวัดที่ดีดังนั้นการใช้ซ้ำEachเพื่อย้ำไปยังรายการที่สร้างขึ้น

พื้นหลังเล็กน้อยบน Whispers:

เสียงกระซิบแตกต่างกันเล็กน้อยในเส้นทางการดำเนินการกับภาษาอื่นส่วนใหญ่ แทนที่จะทำงานผ่านแต่ละบรรทัดเป็นเส้นตรงแยกเฉพาะที่ conditionals, Whispers เริ่มต้นที่บรรทัดสุดท้ายในไฟล์ที่ขึ้นต้นด้วย> (กฎมีความซับซ้อนมากกว่านั้นเล็กน้อย แต่นั่นคือทั้งหมดที่เราต้องรู้ตอนนี้) และความหมายของตัวเลข แตกต่างกันขึ้นอยู่กับว่าเส้นเริ่มต้นด้วยหรือ>>>

หากบรรทัดเริ่มต้นด้วย>เช่น> 1หรือ> Inputนี่คือเส้นคงที่ - มันจะส่งกลับค่าเดียวกันทุกครั้ง ที่นี่ตัวเลขแสดงถึงรูปแบบตัวเลขดังนั้นบรรทัดแรกจะส่งคืน1เสมอเมื่อถูกเรียก

หากบรรทัดนั้นขึ้นต้นด้วย>>ตัวเลขจะถือว่าเป็นการอ้างอิงไปยังบรรทัดอื่น ๆ เช่นการเรียกใช้ฟังก์ชันหากคุณต้องการ ตัวอย่างเช่นในบรรทัด>> 1…2สิ่งนี้ไม่ได้ดำเนินการคำสั่งกับจำนวนเต็ม1และ2แต่จะใช้กับค่าที่ส่งคืนจากบรรทัด1และ 2 ในกรณีนี้ค่าเหล่านั้นคือจำนวนเต็ม1และจำนวนเต็มใด ๆ ที่เราส่งผ่านเป็นอินพุต

สำหรับตัวอย่างนี้ลองพิจารณาอินพุตของ 23 เก็บไว้ในใจว่าเนื่องจากกระซิบ preprocessing, บรรทัดที่สอง ( > Input) > 23จะถูกแปลงเป็น

คำสั่งแรกของเราอยู่ในสายที่ >> 1…23: เป็นช่วง dyadic ในกรณีนี้จาก1ที่จะ23ยอม{1, 2, ... 22, 23} ต่อไปเราข้ามไปที่บรรทัดที่9ถึง12 :

>> Each 4 3
>> Each 5 9
>> Each 6 10
>> Each 7 11 3

ที่นี่เรามีEachคำสั่งที่สอดคล้องกัน 4 รายการซึ่งแต่ละประโยคจะซ้ำกับผลลัพธ์ก่อนหน้าโดยจะทำการจับคู่คำสั่ง 4 กับอาร์เรย์ในบรรทัดที่3 : ช่วง สามคำสั่งแรกคือแผนที่ง่าย ๆ ที่มีบรรทัดที่4 , 5และ 6 :

>> L!
>> L+1
>> L∣2

ทั้งสามคำสั่งเหนือจำนวนเต็มnให้ผลตอบแทน(n! +1) ∣xโดยที่! หมายถึงแฟคทอเรียล , หมายถึงการหารและxคืออินพุต ในที่สุดบรรทัด 12มีโครงสร้างของแผนที่แบบ dyadic

แผนที่ dyadicโครงสร้างต้องใช้เวลาสามจำนวนเต็ม: เป้าหมายด้านซ้ายและขวาของแต่ละดัชนีจะสายอื่น ๆ ที่นี่เราซิปซ้ายและขวาเพื่อสร้างรายการคู่จากนั้นลดแต่ละคู่โดยคำสั่ง dyadic (เป้าหมาย) ที่นี่หากอินพุตคือ23รายการจะเป็น{1, 2, ... 22, 23}และ {0, 0, ... 1, 0}และคำสั่งคือ

>> L⋅R

ซึ่งคูณอาร์กิวเมนต์ซ้ายทางขวา สิ่งนี้สร้างอาร์เรย์ของจำนวนเต็มโดยมี0ที่ดัชนีของจำนวนเต็มซึ่งแฟคทอเรียลที่เพิ่มขึ้นไม่สามารถหารด้วยอินพุทและดัชนีดั้งเดิมที่พวกมันอยู่ เราจะเรียกอาร์เรย์นี้ ต่อไปเราจะลบ0วินาทีออกจากAโดยการตั้งค่าความแตกต่างระหว่าง{0}และ A :

> {0}
>> 12∖13

ด้วยการป้อนข้อมูลตัวอย่างของเรานี้ผลิตชุด{14, 18, 22} ต่อไปเราจะนำส่วนที่เหลือของอินพุตที่ถูกหารด้วยแต่ละค่าในชุดและตรวจสอบว่าส่วนที่เหลือนั้นไม่เท่ากับ 1 :

>> 2%L
>> Each 8 14
>> L≠1
>> Each 16 15

อีกครั้งเรามีรายการเป็น0หรือ1วินาทีและต้องการลบ0วินาทีและแทนที่1วินาทีด้วยค่าดั้งเดิม ที่นี่เราทำซ้ำรหัสที่เราเห็นข้างต้น แต่มีมากกว่า>> 18∖13 12ในที่สุดเราก็ส่งชุดผลลัพธ์นี้ไปยังรายการสำหรับการตรวจสอบขั้นสุดท้าย แต่น่าเสียดายที่รหัสของเรายังต้องปฏิเสธตัวเลขประกอบที่บรรลุเกณฑ์ทั้งหมดเหล่านี้เช่น437 ดังนั้นเราจึงเพิ่มการตรวจสอบครั้งสุดท้ายของเราคูณรายการสุดท้ายของเราด้วยความเป็นอันดับหนึ่งของอินพุต เนื่องจากการคูณ Python ทำงานกับรายการ0แทนที่ด้วยรายการที่ว่างเปล่าและ1ไม่มีผล ดังนั้นเราคำนวณความเป็นอันดับหนึ่งของอินพุตคูณด้วยรายการ ms สำหรับอินพุตและ ouput ผลลัพธ์สุดท้าย:

>> 2’
>> 21⋅20
>> Output 22

0

APL (NARS) 65 ตัวอักษร 130 ไบต์

{∼0π⍵:0⋄m←⎕ct⋄⎕ct←0⋄r←⍬≢a/⍨{0≠⍵∣p}¨a←k/⍨0=⍵∣1+!k←⍳p←¯1+⍵⋄⎕ct←m⋄r}

นี่ 23x มันหมายถึง 23r1 และเศษส่วน 23/1, ดังนั้นส่วนอื่นทั้งหมด; ทดสอบ:

  f←{∼0π⍵:0⋄m←⎕ct⋄⎕ct←0⋄r←⍬≢a/⍨{0≠⍵∣p}¨a←k/⍨0=⍵∣1+!k←⍳p←¯1+⍵⋄⎕ct←m⋄r}
  f¨23x 59x 83x 109x 139x 593x
1 1 1 1 1 1 
  f¨5x 7x 73x 89x 263x 437x
0 0 0 0 0 0 

0

C # (Visual C # Interactive Compiler) , 138 + 22 = 160 ไบต์

n=>Enumerable.Range(2,n-2).All(x=>n%x>0)&Enumerable.Range(1,n).Any(x=>{BigInteger a,b=1;for(a=1;a<=x;a++)b*=a;return(b+1)%n<1&(n-1)%x>0;})

TIO ไม่ได้ใช้งานไลบรารี System.Numerics ในรุ่น Mono ดังนั้นคุณสามารถเห็นผลลัพธ์ลองออนไลน์! ที่นี่แทน

คำอธิบาย:

using System.Numerics; //necessary to handle large numbers created by the factorials

return 
    Enumerable.Range(2,n-2).All(x=>n%x>0)       // is prime
    &
    Enumerable.Range(1,n).Any(x=>
    {
        BigInteger a,b=1;for(a=1;a<=x;a++)b*=a; //b = a!
        return (b+1)%n<1
               &                                //the condition for PPs
               (n-1)%x>0;             
    });

0

CJam , 37 ไบต์

ri_mp\[_{_M)m!)@%!\_M)%1=!@&\}fM]);:|

ขาออก11ถ้าใส่เป็น Pillai สำคัญมิฉะนั้น00, 01หรือ10

คำอธิบาย:

                                         e# Explanation | Stack
ri_mp\[_{_M)m!)@%!\_M)%1=!@&\}fM]);:|    e# Whole code | Example input: 593
ri                                       e# Read input as integer | 593
  _                                      e# Duplicate | 593 593
   mp                                    e# Is it prime? | 593 1
     \                                   e# Swap top two stack elements | 1 593
      [                         ]        e# Delimits an array. Any operations that
                                         e# push a value are placed into the array
       _                                 e# Duplicate | 1 593 [593]
        {                    }fM         e# A for loop from 0 to (n-1) looped through
                                         e# variable M
         _                               e# Duplicate top stack value | ...[593 593]
          M)                             e# Get M+1, as if we try M=0 we get an error
                                         e# | ...[593 593 1]
            m!                           e# Factorial | ...[593 593 1]
              )                          e# Add one | ...[593 593 2]
               @                         e# Rotate stack | ...[593 2 593]
                %                        e# Modulus | ...[593 2]
                 !                       e# Equal to 0? | ...[593 0]
                  \_                     e# Swap and duplicate | ...[0 593 593]
                    M)                   e# Push M+1 | ...[0 593 593 1]
                      %                  e# Modulus | ...[0 593 0]
                       1=!               e# Not equal to 1? | ...[0 593 1]
                          @              e# Rotate | ...[593 1 0]
                           &             e# AND | ...[593 0]
                            \            e# Swap | ...[0 593]
                             }     
                                ]
                                 );      e# Dump and discard last element
                                         e# | 1 593 [...]
                                   :|    e# Flatten array with OR | 1 1
                                         e# Implicit output

ลองออนไลน์!

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