นวนิยายสำคัญของการจ่ายค่าตอบแทน


20

พื้นหลัง

ผู้คนกำลังพูดถึงการแยกตัวประกอบที่สำคัญในการแชทและเราพบว่าตัวเองกำลังพูดถึงการจ่ายคืน Repunitsเป็นส่วนหนึ่งของตัวเลขที่รู้จักกันเป็น repdigits ซึ่งเป็นตัวเลขที่ประกอบด้วยตัวเลขเพียงการทำซ้ำเช่น222หรือ4444444444444444แต่ repunits 1มีเพียงของ

repunits คู่แรกจึง1, 11, 111ฯลฯ เหล่านี้จะถูกอ้างถึงโดยR nดังนั้นR 1 = 1, R 2 = 11ฯลฯ และจะถูกสร้างโดยสูตรด้วยR(n) = (10^n - 1)/9n > 0

การแยกตัวประกอบเฉพาะของหมายเลขการจ่ายซ้ำเหล่านี้ตามลำดับA102380ใน OEIS ตัวอย่างเช่น:

R 1 = 1
R 2 = 11
R 3 = 111 = 3 * 37
R 4 = 1111 = 11 * 101
R 5 = 11111 = 41 * 271
R 6 = 111111 = 3 * 7 * 11 * 13 * 37
R 7 = 1111111 = 239 * 4649
...

ความท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นซึ่งเมื่อได้รับการป้อนข้อมูลจำนวนเต็มnกับn >= 2ผ่านSTDIN หรือเทียบเท่าผลผลิตหรือผลตอบแทนนวนิยายปัจจัยที่สำคัญสำหรับR nในรูปแบบที่สะดวกใด ๆ "ปัจจัยสำคัญนวนิยาย" นี่หมายถึงทุกสิ่งxที่xเป็นปัจจัยสำคัญของR nแต่xไม่ใช่ปัจจัยสำคัญสำหรับR kใด ๆ ก่อนหน้าด้วย1 <= k < n(เช่นถ้าเราเขียนปัจจัยสำคัญสำหรับRทั้งหมดตามลำดับเราไม่เห็นxก่อน).

ตัวอย่าง

Input: 6
Output: 7, 13
(because 3, 11, and 37 are factors of a smaller R_k)

Input: 19
Output: 1111111111111111111
(because R_19 is prime, so no other factors)

Input: 24
Output: 99990001
(because 3, 7, 11, 13, 37, 73, 101, 137, 9901 are factors of a smaller R_k)

Input: 29
Output: 3191, 16763, 43037, 62003, 77843839397
(because no factors of R_29 are also factors of a smaller R_k)

ความพิเศษ:

  • n < 2รหัสของคุณสามารถทำอะไรหรือไม่มีอะไรถ้า
  • คุณสามารถใช้ขีด จำกัด บนสุดที่ "สมเหตุสมผล" nสำหรับการทดสอบและการดำเนินการ - โค้ดของคุณจะไม่ถูกคาดหวังว่าจะส่งออกn = 10000000ตัวอย่างเช่น แต่อัลกอริทึมของคุณควรทำงานในกรณีดังกล่าว
  • นี่คือเว็บไซต์ที่อุทิศให้กับค่าใช้จ่ายสำหรับการอ้างอิง
  • ฉันไม่ได้ผ่านทางคณิตศาสตร์ แต่ผมเสนอสมมติฐานที่ว่าทุกnมีผลแตกต่างกันสำหรับขั้นตอนวิธีนี้ - นั่นคือไม่มีnอยู่เช่นว่าR nไม่มีปัจจัยนวนิยาย ฉันจะเสนอค่าหัว 250 จุดถ้ามีคนพิสูจน์หรือหักล้างในคำตอบของพวกเขา โทมัสควาเสนอหลักฐานที่สง่างามและฉันได้รับรางวัล

การตรวจสอบและตัวประกอบเฉพาะในตัวเป็นเกมที่ยุติธรรม?
Martin Ender

@ MartinBüttnerไม่มีข้อ จำกัด
AdmBorkBork


@alephalpha เพราะแน่นอนว่ามีลิงก์ OEIS ;-) ขอบคุณ!
AdmBorkBork

คำตอบ:


5

Pyth, 16 14 13 ไบต์

-F_m{P/^Td9SQ

อย่างที่ฉันบอกได้ 19 ใช้เวลาตลอดไป

-F_m{P/^Td9SQ      Implicit: Q = input
           SQ      Inclusive range 1 to Q
                        Implicit lambda d:
    {P                  unique primes dividing
       ^Td              10**d
      /   9                  //9
   m               map lambda over the range
   m{P/^Td9SQ      Unique prime factors of all repunits up to the Qth
  _                Reverse the list
-F                 Reduce by set difference

ลองมันนี่


หากคุณเรียกใช้จากบรรทัดคำสั่งและติดตั้ง SymPy แล้ว 19 จะเสร็จสมบูรณ์ภายในไม่กี่วินาที อันแรกที่ใช้เวลามากกว่า 2 วินาทีคืออินพุท 38
isaacg

12

พิสูจน์ให้เห็นว่าการจ่ายเงินคืนทุกครั้งมีปัจจัยสำคัญที่แปลกใหม่

การใช้ทฤษฎีบทของ Zsigmondyพิสูจน์ได้ง่าย จากวิกิพีเดีย:

ในทฤษฎีจำนวนทฤษฎีบท Zsigmondy ของการตั้งชื่อตามคาร์ล Zsigmondy รัฐว่าถ้าA> b> 0เป็นจำนวนเฉพาะสัมพัทธ์แล้วสำหรับจำนวนเต็มใด ๆn ≥ 1มีจำนวนเฉพาะP (เรียกว่าหารสำคัญดั้งเดิม) ที่แบ่งn - ขnและไม่ได้แบ่งk - ขkสำหรับการใด ๆ จำนวนเต็มบวกk <nมีข้อยกเว้นต่อไปนี้: [สิ่งที่ไม่ได้ใช้ที่นี่]

พิจารณา repunits ครั้งที่ 9: นั่นคือ10 n -1 โดยทฤษฎีบทของ Zsigmondy ที่มี= 10 , b = 1จะมีค่าเฉพาะp | 10 n -1ที่ไม่ได้แบ่งใด ๆ10 k -1 , k <n

  • ตั้งแต่หน้าเป็นนายกรัฐมนตรีและ10 n -1 = 9 · R nจะต้องแบ่งทั้ง9หรือR n

  • Pไม่สามารถแบ่ง 9ตั้งแต่ 9 = 10 1 -1

  • ดังนั้นPแบ่งR n

  • Pไม่สามารถแบ่งใด ๆ R kเพราะมันไม่ได้แบ่ง 10 k -1 = 9 · R k

ดังนั้นPจาก Zsigmondy ทฤษฎีบทเป็นปัจจัยสำคัญนวนิยายของR n , n ≥ 2 ∎


ตัวอย่างของปัจจัยสำคัญที่แปลกใหม่

นายก487เป็นปัจจัยสำคัญที่ทำซ้ำของR 486 :

โดยทฤษฎีบทแฟร์มาต์-ออยเลอร์, 10 487-1 ≡ 1 (สมัย 487) ลำดับของ 10 mod 487 คือพลังที่เล็กที่สุดของ 10 นั่นคือ 1 mod 487 ดังนั้นจะต้องเป็นตัวหารของ 486 ที่จริงแล้วลำดับเท่ากับ 486 มันเกิดขึ้นที่ไม่เพียง10 486 ≡ 1 (สมัย 487)ก็ยังเป็นที่ 1 (สมัย 487 2 )

ดูที่นี่ว่าลำดับของ 10 mod 487 คือ 486; นั่นคือไม่น้อย10 k -1หารด้วย 487. เห็นได้ชัดว่า 487 ไม่ได้แบ่ง 9 ดังนั้นจึงต้องแบ่งR 486


6

CJam, 18 ไบต์

{{)'1*imf}%W%:-_&}

ทดสอบที่นี่

เริ่มต้นที่ 19 (การจ่ายค่าชดเชยครั้งแรกหลังจาก 2) มันจะใช้เวลาค่อนข้างนาน

คำอธิบาย

นี่คือบล็อกที่ไม่มีชื่อ (เทียบเท่าฟังก์ชันของ CJam) ซึ่งคาดว่าหมายเลขอินพุตnในสแต็กและออกจากรายการปัจจัยหลักแทน:

{      e# Map this block over [0 1 ... n-1]...
  )'1* e#   Increment and create a string of that many 1s.
  i    e#   Convert to integer.
  mf   e#   Get its prime factors.
}%
W%     e# Reverse the list.
:-     e# Fold set difference onto the list, removing from the first list the elements of
       e# all other lists.
_&     e# Remove duplicates. Unfortunately, this necessary. Thomas Kwa found that the 486th
       e# repunit contains 487^2 (where 487 is a novel prime factor).

3
ไม่ ... คุณเล่นกอล์ฟอย่างจริงจังจาก 20 เป็น 16 ในสามนาทีที่ผ่านมาหรือไม่ >.>
AdmBorkBork

@ TimmyD Sort of ... ตอนนี้ฉันต้องขึ้นไปอีก 18 ครั้งเพราะมันเปิดออกรหัสของฉันก็ขึ้นอยู่กับสมมติฐานที่ฉันไม่สามารถพิสูจน์หรือพิสูจน์ได้ในขณะนี้
Martin Ender

Ooo นั้นเป็นกรณีที่น่าสนใจ - ปัจจัยใหม่ที่ซ้ำกัน รับได้สวย.
AdmBorkBork

4

Haskell 86 ไบต์

import Data.Numbers.Primes
f n=[x|x<-primeFactors$div(10^n-1)9,notElem x$f=<<[1..n-1]]

ตัวอย่างการใช้งาน: ->f 8[73,137]

ใช้เวลาและความทรงจำnมากมาย

การดำเนินงานโดยตรงของความหมาย: ใช้ปัจจัยที่สำคัญทั้งหมดxของRnซึ่งจะไม่แสดงขึ้นมาก่อน ( f=<<[1..n-1]เป็นปัจจัยที่สำคัญทั้งหมดของR1 ... R(n-1))


3

Mathematica 82 74 63 ไบต์

บันทึกได้ 11 ไบต์ด้วย alephalpha

Complement@@Reverse@FactorInteger[(10^Range@#-1)/9][[;;,;;,1]]&

ปัจจัยสำคัญของ R70

(10 ^ 70 - 1) / 9 = 11111111111111111111111111111111111111111111111111111111111111111111111111111111

FactorInteger[(10^70 - 1)/9]

{{11, 1}, {41, 1}, {71, 1}, {239, 1}, {271, 1}, {4649, 1}, {9091, 1}, {123551, 1}, { 909091, 1}, {4147571, 1}, {102598800232111471, 1}, {265212793249617641, 1}}


ปัจจัยสำคัญของนวนิยายเรื่อง R70

Complement@@Reverse@FactorInteger[(10^Range@#-1)/9][[;;,;;,1]]&[70]

{4147571, 265212793249617641}


Complement@@Reverse@FactorInteger[(10^Range@#-1)/9][[;;,;;,1]]&
alephalpha

กรุณาอธิบายความหมายของหรือ[[;;,;;,1]] [[1 ;; All, 1 ;; All, 1]]ฉันงง!
DavidC

@DavidCarraher ใช้องค์ประกอบแรกของทุกองค์ประกอบของทุกองค์ประกอบของรายการ
LegionMammal978

@DavidCarraher เป็นเช่นเดียวกับ[[;;,;;,1]] [[All,All,1]]
alephalpha

ตอนนี้ที่เหมาะสม BTW ตำแหน่งที่อยู่ใหม่ของคุณRangeนั้นฉลาดมาก
DavidC

2

MATL , 25 ไบต์

ใช้งานได้กับอินพุตสูงสุด16:

10,i:^9/Y[t0)Yftb!w\~s1=)

รุ่นต่อไปนี้ใช้31 ไบต์18และทำงานขึ้นไป เพราะ19มันต้องการหน่วยความจำประมาณ 4 GB (ฉันไม่สามารถเรียกใช้)

10,i:^9/Y[t0)5X2Y%Yfotb!w\~s1=)

ตัวอย่าง

>> matl
 > 10,i:^1-,9/t0)5X2Y%Yfotb!w\~s1=)
 > 
> 6
7 13

คำอธิบาย

6พิจารณาสำหรับการป้อนข้อมูลเป็นรูปธรรม อันดับแรก111111คำนวณยอดของ; ในกรณีนี้ผลที่ได้คือ3, 7, 11, ,13 37จากนั้นมอดุโล (ส่วนที่เหลือ) จะถูกคำนวณรวมกันทั้งหมดของตัวเลข1, 11... 111111และตัวหารคำนวณ วิธีนี้เป็นการขยายผลแบบซิงเกิลตันของ MATL ผลลัพธ์คือในกรณีนี้คือเมทริกซ์6x 5โดยแต่ละคอลัมน์สอดคล้องกับหนึ่งในตัวหาร ตัวหารที่ยอมรับ (คอลัมน์) คือ1ค่าที่มีเฉพาะค่า (คือตัวสุดท้าย) ที่เหลือเป็นศูนย์

10,i:^9/Y[   % generate vector with `1`, `11`, ... depending on input number, say "n"
t0)          % pick the last element: `111...1` (n ones)
5X2Y%        % * convert to uint64, so that larger numbers can be handled
Yf           % prime factors                                             
o            % * convert to double precision, so that modulus can be done
t            % duplicate                                                 
b            % bubble up element in stack                                
!            % transpose                                                 
w            % swap elements in stack                                    
\            % modulus after division (element-wise, singleton expansion)
~s           % number of zero values in each column
1=           % is equal to 1? (element-wise, singleton expansion)
)            % index divisors with that logical index

(*) ลบออกในเวอร์ชั่นสั้น


นั่นเป็นวิธีที่ชาญฉลาดในการทำมัน
AdmBorkBork

2

Julia, 103 ไบต์

R(n)=[keys(factor((10^n-19))...]
n->(r=R(n);isprime(r)?r:setdiff(r,reduce(vcat,[R(i)for i=1:n-1])))

Rนี้เป็นฟังก์ชั่นที่ไม่มีชื่อที่เรียกฟังก์ชั่นผู้ช่วย f=n->...จะเรียกมันว่าให้ฟังก์ชั่นหลักของชื่อเช่น

Ungolfed:

function R(n::Integer)
    collect(keys(factor((10^n - 1) ÷ 9)))
end

function f(n::Integer)
    r = R(n)
    if isprime(r)
        r
    else
        setdiff(r, reduce(vcat, [R(i) for i = 1:n-1]))
    end
end

2

LabVIEW, 33 LabVIEW Primitives

19 ใช้เวลาตลอดไป ...

ทำงานโดยบันทึกช่วงเวลาทั้งหมดและการลบองค์ประกอบจากชุดสุดท้ายเมื่อพบในอาร์เรย์อื่น


1

J, 24 ไบต์

[:({:-.}:)@:q:[:+/\10^i.

คาดว่าจะเป็นตัวเลขที่มีความแม่นยำสูงหลังจาก 6 (เช่น19xแทน19)

ลองออนไลน์!

อาจมีวิธีที่สั้นกว่าในการสร้างค่าตอบแทนซึ่งหลีกเลี่ยงการแคปเช่นกัน

คำอธิบาย

[: ({: -. }:) @: q: [: +/\ 10 ^ i.
                                i. Range [0, input)
                           10 ^    10 raised to the power of the range
                       +/\         Running sum of this list (list of repunits)
                 q:                Prime factors of the repunits
              @:                   Composed with
   ({: -. }:)                      Unique prime factors of last repunit
    {:                              Factors of last repunit (tail of matrix)
       -.                           Set subtraction with
          }:                        Rest of the matrix (curtail)

มันใช้งานได้อย่างไร

ฉันคิดว่าคำอธิบายแบบภาพเหล่านี้ง่ายต่อการท้องสำหรับผู้ที่ไม่ทราบว่าเจเหล่านี้เป็นผลมาจาก REPL

   10 ^ i.6
1 10 100 1000 10000 100000

   +/\ 10 ^ i. 6
1 11 111 1111 11111 111111

   q: +/\ 10 ^ i. 6
 0   0  0  0  0
11   0  0  0  0
 3  37  0  0  0
11 101  0  0  0
41 271  0  0  0
 3   7 11 13 37

   ({: -. }:) q: +/\ 10 ^ i. 6
7 13
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.