คำนวณลำดับเลขจำนวนเต็มที่ได้จากปัจจัยหลัก


10

สร้างฟังก์ชั่นการแสดงออกหรือโปรแกรมที่ทำต่อไปนี้:

  1. นำปัจจัยสำคัญของตัวเลขใด ๆ มารวมกัน ตัวอย่างเช่นปัจจัยหลักของ 28 คือ 2 2 7 รวมเป็น 11
  2. คูณผลลัพธ์ด้วยจำนวนของปัจจัยหลักสำหรับจำนวนที่กำหนด เช่น 28 มี 3 ปัจจัยหลักซึ่งรวมถึง 11 11 * 3 คือ 33
  3. ทำซ้ำกระบวนการซ้ำโดยจัดเก็บรายการผลลัพธ์ (ซึ่งเริ่มต้นด้วยหมายเลขเดิม) จนกว่าคุณจะไปถึงหมายเลขที่รวมอยู่ในรายการแล้ว หยุดโดยไม่เพิ่มหมายเลขสุดท้ายนั้นเพื่อให้รายการไม่มีรายการที่ซ้ำกัน ความก้าวหน้าของ 28 คือ 28 33 เพราะ 33 ผลลัพธ์ใน 28 อีกครั้ง
  4. นับองค์ประกอบในรายการผลลัพธ์ ในกรณีที่ 28 คำตอบคือ 2

นี่คือผลลัพธ์สำหรับ0<n<=10เพื่อให้คุณสามารถตรวจสอบอัลกอริทึมของคุณ

2 1 1 10 1 11 1 9 5 10

(ตามที่ balpha ชี้ให้เห็นคำตอบhigley(1)คือ 2 จากรายการ 1 0 ฉันมี 1 เนื่องจากข้อผิดพลาดในอัลกอริทึมดั้งเดิมของฉันเขียนใน J)

เนื่องจากฉันเป็น SOB ที่หยิ่งผยองและไม่พบสิ่งนี้ในOEISเราเรียกสิ่งนี้ว่า "Higley Sequence" อย่างน้อยก็ในช่วงระยะเวลาของการแข่งขันกอล์ฟรหัสนี้ เป็นโบนัสเพิ่มหาสองคนแรกnที่มีต่ำสุดhigley(n)ที่ไม่ได้เป็นนายกรัฐมนตรีและn n>1(ฉันคิดว่ามีเพียงสอง แต่ฉันไม่สามารถพิสูจน์ได้)

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


4
เป็นเพราะเหตุใดhighley(1) == 1? ไม่มีสิ่งใดเป็นปัจจัยสำคัญดังนั้นรายการผลลัพธ์ใน 4) [1, 0]จึงhighley(1) == 2เป็นอย่างที่ฉันเห็น
balpha

เราสามารถสมมติว่าหมายเลขอินพุตและค่ากลางจะไม่มากกว่า 2 ^ 31-1 (เช่นพอดีในจำนวนเต็ม 32- บิตที่เซ็นชื่อแล้ว)
Peter Taylor

@ ปีเตอร์เทย์เลอร์ชัวร์
Gregory Higley

ในกรณีที่ใคร ๆ เห็นว่าเป็นประโยชน์ลำดับ OEIS ที่สัมพันธ์กันอย่างคลุมเครือและอาจให้แรงบันดาลใจคือ A001414, A001222 และ A002217
Peter Taylor

1
เนื่องจากคุณยังไม่ได้แสดงความคิดเห็นฉันถือว่าคุณไม่ได้สังเกตเห็น: ฉันพิสูจน์แล้วว่ามีเพียงสองจุดที่ไม่ใช่เฉพาะและเพิ่มเป็นภาคผนวกในโพสต์ของฉัน
Peter Taylor

คำตอบ:


6

J, 47 45

#@((~.@,[:(+/@{:*+/@:*/)2 p:{:)^:_)`2:@.(=&1)

เป็นไปได้ที่จะสั้นกว่านี้มากโดยไม่ใช้^:_แต่สมองของฉันถูกทอดอย่างเพียงพอแล้ว

แก้ไข: (47-> 45) สองวันคูปอง

การใช้งาน:

   higley =: #@((~.@,(+/@{:*+/@:*/)@(2&p:)@{:)^:_)`2:@.(=&1)
   higley 1
2
   higley"0 (1 + i. 10)
2 1 1 10 1 11 1 9 5 10

ว้าว! โซลูชัน AJ ที่สั้นกว่าโซลูชัน GolfScript ครั้งแรกที่ฉันได้เห็น (ฉันเป็นแฟนตัวยงของเจ)
Gregory Higley

3
คุณสามารถย่อให้สั้นลงได้มากโดยใช้อัลกอริทึมที่แตกต่างกันเล็กน้อย: #@((~.@,((+/*#)@:q:)@{:)^:_)`2:@.(=&1)ซึ่งคือ 38 ตัวอักษร
Gregory Higley

ว้าวฉันพยายามคิดว่าจะทำอย่างไรกับ q: แต่พยายามที่จะจัดการมันใน 2 p ของฉัน: วิธีแก้ปัญหาดังนั้นฉันจึงไม่ได้รับมัน เห็นได้ชัดในการหวนกลับ
Jesse Millikan

ความจริงที่ว่าคุณสามารถดูการระเบิดของตัวละครและพูดว่า " ชัดเจนในการหวนกลับ " เพียงแค่ระเบิดความคิดของฉัน วันหนึ่งฉันควรตรวจสอบ Golfscript หรือ J.
Casey

@ กรณีที่ฉันรู้สึกแบบเดียวกันในครั้งเดียว แต่ยิ่งคุณเรียนรู้และใช้ J มากเท่าไหร่มันก็จะ "กระโดดออกไปหาคุณ" มากกว่านี้ แต่ฉันก็ยังเห็นสิ่งที่ฉันต้องไขปริศนา สิ่งหนึ่งที่มีประโยชน์ที่ควรทราบเกี่ยวกับ J คือถ้าคุณเพิ่ม หรือหลังจากสัญลักษณ์จะสร้างสัญลักษณ์ใหม่เช่น{, {.และ{:สิ่งที่แตกต่างกันทั้งหมดเฉลี่ย แต่{-(ตัวอย่าง) แน่นอนลำดับของสองสิ่งที่และ{ -
Gregory Higley

5

Golfscript, 68 67 62 61 ตัวอักษร

[.]({[.2@{1$1$%{)}{\1$/1$}if}*;;].,*0+{+}*.2$?@@.@+\@)!}do;,(

นี่คือนิพจน์: มันใช้nกับสแต็กและทิ้งผลลัพธ์ไว้บนสแต็ก หากต้องการเปลี่ยนเป็นโปรแกรมที่ใช้nจาก stdin และพิมพ์ผลลัพธ์เป็น stdout ให้แทนที่ส่วนนำ[ด้วย~

หัวใจของมันคือ[.2@{1$1$%{)}{\1$/1$}if}*;;](28 ตัวอักษร) ซึ่งใช้จำนวนสูงสุดบนสแต็กและ (โดยอัลกอริทึมที่ไม่มีประสิทธิภาพอย่างไม่น่าเชื่อ) สร้างรายการของปัจจัยสำคัญ pseudocode เทียบเท่า C สไตล์:

ps = [], p = 2;
for (int i = 0; i < n; i++) {
    if (n % p == 0) {
        ps += p;
        n /= p;
    }
    else p++;
}

0+ก่อน{+}*คือการจัดการกับกรณีพิเศษn==1เพราะ Golfscript ไม่ชอบพับดำเนินการทวิภาคมากกว่ารายการที่ว่างเปล่า

หนึ่งในจุดตรึงที่ไม่ใช่นายกคือ 27; ฉันพบนี้โดยไม่ต้องใช้โปรแกรมโดยพิจารณาจากการทำแผนที่ (p 2 P) ซึ่งเป็น fixpoint ถ้า == P (a-1) / 2และพยายามเล็ก ๆ ( ให้ fixpointedness ของจำนวนเฉพาะ) ->aa==1

การค้นหาด้วยโปรแกรมจะเปลี่ยนจุดกำหนดที่สอง: 30 = (2 + 3 + 5) * 3


ภาคผนวก: พิสูจน์ได้ว่ามีจุดแก้ไขที่ไม่สำคัญเพียงสองจุดเท่านั้น

สัญกรณ์: sopfr(x)คือผลรวมของปัจจัยสำคัญของxด้วยการทำซ้ำ (A001414) Omega(x)คือจำนวนของปัจจัยสำคัญx(A001222) ฟังก์ชันตัวตายตัวแทนของ Higley คือh(x) = sopfr(x) Omega(x)

สมมติว่าเรามี fixpoint N = h(N)ซึ่งเป็นผลคูณของn=Omega(N)primes

N = p_0 ... p_{n-1} = h(N) = n (p_0 + ... + p_{n-1})

ทฤษฎีจำนวนพื้นฐาน: nแบ่งออกเป็นp_0 ... p_{n-1}ดังนั้นในช่วงเวลาเหล่านั้นเป็นปัจจัยที่สำคัญของw=Omega(n) nWLOG wเราจะพาพวกเขาจะเป็นครั้งสุดท้าย ดังนั้นเราสามารถหารทั้งสองข้างด้วยกันnและได้

p_0 ... p_{n-w-1} = p_0 + ... + p_{n-1}

หรือ

p_0 ... p_{n-w-1} = p_0 + ... + p_{n-w-1} + sopfr(n)

ระบุว่าทั้งหมดของจำนวนเฉพาะp_0ที่จะp_{n-w-1}มีมากขึ้นกว่า 1, การเพิ่มใด ๆ ของพวกเขาเพิ่ม LHS มากกว่า RHS ดังนั้นสำหรับให้nเราสามารถระบุการแก้ปัญหาของผู้สมัครทั้งหมด

โดยเฉพาะอย่างยิ่งจะไม่มีวิธีแก้ปัญหาถ้า LHS มากกว่า RHS ตั้งค่าเฉพาะ "ฟรี" เป็น 2 ทั้งหมดคือไม่มีวิธีแก้ปัญหาหาก

2^{n-w} > 2 (n-w) + sopfr(n)

ตั้งแต่sopfr(n) <= n(ด้วยความเสมอภาคเท่านั้นสำหรับ n = 4 หรือ n ไพรม์) เราสามารถทำให้ข้อความที่อ่อนแอกว่าว่าไม่มี fixpoints หาก

2^{n-w} > 3 n - 2 w

โฮลดิ้งwคงที่เราสามารถเลือกค่าที่แตกต่างกันของความพึงพอใจn w=Omega(n)ที่เล็กที่สุดเช่นมีn 2^wโปรดทราบว่าถ้า2^{n-w}อย่างน้อย 3 (เช่นถ้าn-w>1ซึ่งเป็นจริงถ้าn>2) จากนั้นเพิ่มขึ้นnในขณะที่การถือครองwอย่างต่อเนื่องจะเพิ่ม LHS มากกว่า RHS โปรดสังเกตว่าสำหรับw>2และการที่เล็กที่สุดเท่าที่เป็นไปได้nความไม่เท่าเทียมกันก็เป็นที่พอใจและไม่มีจุดแก้ไข

นั่นทำให้เรามีสามกรณี: w = 0และn = 1; w = 1และnเป็นนายก; หรือw = 2และnกึ่งนายก

กรณีw = 0. n = 1ดังนั้นNนายกใด ๆ

กรณีw = 1. ถ้าอย่างn = 2นั้นN = 2pและเราต้องการp = p + 2ซึ่งไม่มีวิธีแก้ปัญหา หากn = 3แล้วเรามีpq = p + q + 3และสองการแก้ปัญหาและ(p=2, q=5) (p=3, q=3)หากn = 5แล้วดังนั้นจะไม่มีการแก้ปัญหาต่อไปด้วย2^4 > 3 * 5 - 2 * 1w = 1

กรณีw = 2. หากn = 4แล้วและเราจำเป็นต้องมีN = 4pq pq = p + q + 4นี่มีวิธีแก้ปัญหาจำนวนเต็มp=2, q=6แต่ไม่มีวิธีแก้ปัญหาที่สำคัญ หากn = 6แล้วดังนั้นจะไม่มีการแก้ปัญหาต่อไปด้วย2^4 > 3 * 6 - 2 * 2w = 2

ทุกกรณีหมดแล้วดังนั้นจุดแก้ไขที่ไม่สำคัญเท่านั้นคือ 27 และ 30


1
พบ fixpoints เดียวกันสองอันโดยใช้ดินสอและกระดาษ: 27 และ 30 ฉันเห็นด้วยกับ OP ดูเหมือนว่าทั้งสองเป็นเพียง
mellamokb

1
คำถามที่น่าสนใจถัดไปอาจเป็น มีกี่ higley (x) = 2 ไหม? มีวิธีในการสร้าง higley (x) เช่น higley (x) = 100 อย่างไร?
mellamokb

ดีมาก! ฉันเป็นผู้ชาย J แต่อาจต้องเรียนรู้ GolfScript
Gregory Higley

@mellamokb ฉันคิดว่ามีคำถามที่น่าสนใจจำนวนมากตามลำดับนี้ ตัวอย่างเช่นหากเราพิจารณาลำดับของตัวเลขที่สร้างขึ้นสำหรับแต่ละnก่อนที่จะถูกนับมีผู้ใดไม่สำคัญnหลังจาก 49 ซึ่งลำดับดังกล่าวไม่ได้สิ้นสุดใน 28 หรือไม่
Gregory Higley

2
อีกคำถามที่น่าสนใจที่จะถามคือว่ามีฟังก์ชั่นที่เรียบง่ายnซึ่งขอบเขตhigley(n)ด้านบน (นั่นจะช่วยให้ลดความซับซ้อนของลูปได้อย่างมาก - เพียงแค่วนซ้ำf(n)ครั้งแล้วละทิ้งการทำซ้ำ)
Peter Taylor

4

Ruby, 92 ตัวอักษร

f=->i{r=[i];(x=s=0;(2..i).map{|j|(s+=j;x+=1;i/=j)while i%j<1};r<<i=s*x)until r.uniq!;r.size}

วิธีแก้ปัญหานี้ถือว่า higley (1) เป็นจริง 2 ไม่ใช่ 1 (ดูความคิดเห็นของ balpha ด้านบน):

(1..10).map &f
=> [2, 1, 1, 10, 1, 11, 1, 9, 5, 10]


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