Novel Prime Factors of Repunits


20

Latar belakang

Orang-orang berbicara faktorisasi utama dalam obrolan dan kami mendapati diri kami berbicara tentang pembayaran kembali. Repunits adalah himpunan bagian dari angka yang dikenal sebagai repdigits, yang merupakan angka yang hanya terdiri dari digit berulang, seperti 222atau 4444444444444444, tetapi hanya terdiri dari repunits 1.

Oleh karena itu pasangan repunits pertama adalah 1, 11, 111, dll ini disebut oleh R n , sehingga R 1 = 1, R 2 = 11, dll, dan dihasilkan oleh formula R(n) = (10^n - 1)/9, dengan n > 0.

Faktorisasi prima dari angka-angka ini mengikuti urutan A102380 dalam OEIS. Sebagai contoh:

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

Tantangan

Menulis sebuah program atau fungsi yang, ketika diberi masukan bilangan bulat n dengan n >= 2melalui STDIN atau setara , output atau hasil yang baru faktor utama untuk R n , dalam format yang nyaman. "Faktor utama Novel" di sini berarti semua xdi mana xmerupakan faktor utama R n , namun xbukan merupakan faktor utama untuk setiap sebelumnya R k , dengan 1 <= k < n(yaitu, jika kita menulis faktor prima untuk semua R dalam urutan, kita sudah tidak melihat xsebelum).

Contohnya

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)

Ekstra:

  • Kode Anda dapat melakukan apa saja atau tidak sama sekali n < 2.
  • Anda dapat mengasumsikan "wajar" batas atas untuk nuntuk pengujian dan pelaksanaan tujuan - kode Anda tidak akan diharapkan untuk output untuk n = 10000000, misalnya, tetapi algoritma Anda harus bekerja untuk kasus seperti jika diberi daya komputasi terbatas dan waktu.
  • Berikut adalah situs yang didedikasikan untuk faktorisasi gaji untuk referensi.
  • Aku sudah tidak melalui matematika, tetapi saya mengusulkan hipotesis bahwa setiap n memiliki hasil yang berbeda untuk algoritma ini - yaitu, tidak ada n ada sehingga R n tidak memiliki faktor baru. Saya akan menawarkan hadiah 250 poin jika seseorang membuktikan atau membantah hal itu dalam jawaban mereka. Thomas Kwa mengusulkan bukti yang elegan , dan aku menghadiahkan hadiah itu.

Pemeriksaan prima dan factorisation bawaan merupakan permainan yang adil?
Martin Ender

@ MartinBüttner Tidak ada batasan.
AdmBorkBork


@alephalpha Karena tentu saja ada tautan OEIS ;-) Terima kasih!
AdmBorkBork

Jawaban:


5

Pyth, 16 14 13 byte

-F_m{P/^Td9SQ

Seperti yang bisa saya katakan, 19 membutuhkan selamanya.

-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

Coba di sini .


Jika Anda menjalankannya dari baris perintah dan menginstal SymPy, 19 selesai dalam waktu kurang dari satu detik. Yang pertama yang membutuhkan waktu lebih dari 2 detik adalah input 38.
isaacg

12

Bukti bahwa setiap repunit memiliki faktor utama novel

Menggunakan Zsigmondy's Theorem , buktinya sederhana. Dari Wikipedia:

Dalam teori bilangan, teorema Zsigmondy, bernama setelah Karl Zsigmondy, menyatakan bahwa jika a> b> 0 adalah coprime bilangan bulat, maka untuk setiap bilangan bulat n ≥ 1 , ada bilangan prima p (disebut pembagi prima primitif) yang membagi sebuah n - b n dan tidak membagi a k - b k untuk setiap bilangan bulat positif k <n , dengan pengecualian berikut: [hal-hal yang tidak berlaku di sini].

Pertimbangkan pembayaran kali 9: yaitu, 10 n -1 . Oleh Zsigmondy's Theorem dengan a = 10 , b = 1 , ada beberapa p | utama 10 n -1 yang tidak membagi 10 k -1 , k <n .

  • Karena p adalah prima dan 10 n -1 = 9 · R n , ia harus membagi 9 atau R n .

  • p tidak dapat membagi 9 , karena 9 = 10 1 -1 .

  • Oleh karena itu p membagi R n .

  • p tidak bisa membagi setiap R k , karena tidak membagi 10 k -1 = 9 · R k .

Oleh karena itu p dari Zsigmondy's Theorem adalah faktor utama baru dari setiap R n , n ≥ 2 . ∎


Contoh faktor prima novel yang berulang

Prime 487 adalah faktor prime berulang dari R 486 :

Oleh teorema Fermat-Euler, 10 487-1 ≡ 1 (mod 487) . Urutan 10 mod 487, yaitu, kekuatan terkecil dari 10 yaitu 1 mod 487, oleh karena itu harus menjadi pembagi 486. Bahkan, urutannya sama dengan 486. Itu juga terjadi bahwa tidak hanya 10 486 ≡ 1 (mod 487) , ini juga 1 (mod 487 2 ) .

Lihat di sini bahwa urutan 10 mod 487 adalah 486; artinya, tidak ada yang lebih kecil 10 k -1 yang dapat dibagi dengan 487. Jelas, 487 tidak membagi 9, jadi ia harus membagi R 486 .


6

CJam, 18 byte

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

Uji di sini.

Mulai dari 19 (prime repunit pertama setelah 2) akan memakan waktu yang cukup lama.

Penjelasan

Ini adalah blok tanpa nama (setara dengan fungsi CJam), yang mengharapkan nomor input npada stack dan meninggalkan daftar faktor utama sebagai gantinya:

{      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
Apakah ... apakah Anda serius bermain golf dari 20 hingga 16 dalam tiga menit terakhir? >.>
AdmBorkBork

@TimmyD Semacam ... Saya harus naik ke 18 lagi untuk saat ini, karena ternyata kode saya didasarkan pada asumsi yang saya tidak dapat membuktikan atau membantah saat ini.
Martin Ender

Ooo, itu kasus yang menarik - duplikat faktor novel. Tangkapan bagus.
AdmBorkBork

4

Haskell 86 byte

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

Contoh penggunaan: f 8-> [73,137].

Membutuhkan banyak waktu dan memori untuk menjadi besar n.

Implementasi langsung dari definisi: mengambil semua faktor prima xdari Rnyang tidak muncul sebelum ( f=<<[1..n-1]merupakan faktor-faktor utama R1 ... R(n-1)).


3

Mathematica 82 74 63 byte

Dengan 11 byte disimpan berkat alephalpha.

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

Faktor utama 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}}


Faktor utama novel R70

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

{4147571, 265212793249617641}


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

Mohon jelaskan arti [[;;,;;,1]]atau [[1 ;; All, 1 ;; All, 1]]. Saya bingung!
DavidC

@ DavidCarraher Dibutuhkan elemen pertama dari setiap elemen dari setiap elemen daftar.
LegionMammal978

@ DavidCarraher [[;;,;;,1]]sama dengan [[All,All,1]].
alephalpha

Sekarang masuk akal. BTW, lokasi ulang Anda Rangesangat pintar.
DavidC

2

MATL , 25 byte

Ini berfungsi untuk input hingga 16:

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

Versi berikut menggunakan 31 byte dan berfungsi hingga 18. Untuk 19itu membutuhkan sekitar 4 GB memori (saya belum bisa menjalankannya).

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

Contoh

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

Penjelasan

Pertimbangkan untuk masukan konkret 6. Pertama, pembagi utama dari 111111dihitung; dalam hal ini hasilnya 3, 7, 11, 13, 37. Maka operasi modulo (divisi sisa) dihitung untuk semua kombinasi angka 1, 11, ... 111111dan pembagi dihitung. Ini mengeksploitasi ekspansi tunggal implisit MATL. Hasilnya adalah dalam kasus ini 6x 5matriks, dengan masing-masing kolom sesuai dengan salah satu pembagi. Pembagi yang diterima (kolom) adalah yang hanya 1bernilai (yaitu yang terakhir) yang memberikan sisa nol.

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

(*) Dihapus dalam versi pendek


Itu cara yang cerdas untuk melakukannya.
AdmBorkBork

2

Julia, 103 byte

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])))

Ini adalah fungsi tanpa nama yang memanggil fungsi pembantu R. Untuk memanggilnya, beri nama fungsi utama, misalnya f=n->....

Tidak Terkumpul:

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 Primitif

19 membutuhkan selamanya ...

Bekerja dengan menyimpan semua Primes dan menghapus elemen dari set terakhir ketika mereka ditemukan di array lain.


1

J, 24 byte

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

Mengharapkan angka-angka presisi-diperpanjang setelah 6 (misalnya 19xbukannya 19)

Cobalah online!

Mungkin ada cara yang lebih pendek untuk menghasilkan imbalan yang menghindari batasan juga.

Penjelasan

[: ({: -. }:) @: 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)

Cara kerjanya, secara visual

Saya pikir penjelasan visual semacam ini lebih mudah diterima oleh mereka yang tidak tahu J. Ini adalah hasil dari 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.