Nowe główne czynniki repunits


20

Tło

Ludzie rozmawiali o faktoryzacji na czacie, a my rozmawialiśmy o repunitach. Repunity to podzbiór liczb znanych jako repdigits, które są liczbami składającymi się tylko z powtarzających się cyfr, takich jak 222lub 4444444444444444, ale repunity składają się tylko z 1.

Pierwsze kilka repunits są zatem 1, 11, 111, itd. Są one określane przez R n , to R 1 = 1, R 2 = 11, etc., i generowane są przez wzór R(n) = (10^n - 1)/9z n > 0.

Pierwotne faktoryzacja tych ponownych numerów następuje po sekwencji A102380 w OEIS. Na przykład:

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

Wyzwanie

Napisać program lub funkcji, które po podaniu Wejście całkowitą N z n >= 2pośrednictwem standardowego wejścia lub równoważne , wyjść lub zwraca nowe czynniki pierwsze dla R n , w dowolnej dogodnej postaci. „Nowe czynniki pierwsze” oznaczają tutaj wszystko, xgdzie xjest liczbą pierwszą R n , ale xnie jest liczbą pierwszą dla żadnego poprzedniego R k , z 1 <= k < n(tzn. Jeśli piszemy czynniki pierwsze dla wszystkich R w sekwencji, nie widzieliśmy xprzed).

Przykłady

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)

Dodatki:

  • Twój kod może zrobić wszystko lub nic, jeśli n < 2.
  • Można założyć, „rozsądny” górną granicę nw celach testowych i wykonanie - kod nie będzie oczekiwać na wyjście do n = 10000000, na przykład, ale twój algorytm powinien działać w takim przypadku, jeśli dany nieograniczonej mocy obliczeniowej i czasu.
  • Oto strona poświęcona faktoryzacji repunitów w celach informacyjnych.
  • Nie przejrzałem matematyki, ale proponuję hipotezę, że każdy n ma wyraźny wynik dla tego algorytmu - to znaczy, że n nie istnieje tak, że R n nie ma nowych czynników. Oferuję nagrodę w wysokości 250 punktów, jeśli ktoś udowodni lub potwierdzi to w swojej odpowiedzi. Thomas Kwa zaproponował elegancki dowód , a ja przyznałem nagrodę.

Wbudowane sprawdzanie liczb pierwszych i rozkładanie na czynniki pierwsze to uczciwa gra?
Martin Ender,

@ MartinBüttner Brak ograniczeń.
AdmBorkBork,


@alephalpha Ponieważ oczywiście istnieje link OEIS ;-) Dzięki!
AdmBorkBork,

Odpowiedzi:


5

Pyth, 16 14 13 bajtów

-F_m{P/^Td9SQ

Jak mogę powiedzieć, 19 trwa wiecznie.

-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

Wypróbuj tutaj .


Jeśli uruchomisz go z wiersza poleceń i zainstalujesz SymPy, 19 zakończy się w ciągu sekundy. Pierwszy, który zajmuje ponad 2 sekundy, to wejście 38.
isaacg

12

Dowód, że każda ponowna komisja ma nowy czynnik główny

Za pomocą twierdzenia Zsigmondy'ego dowód jest prosty. Z Wikipedii:

W teorii liczb twierdzenie Zsigmondy'ego, nazwane na cześć Karla Zsigmondy'ego, stwierdza, że ​​jeśli a> b> 0 są liczbami całkowitymi, to dla dowolnej liczby całkowitej n ≥ 1 , istnieje liczba pierwsza p (zwane prymitywne prime dzielnik), który dzieli n - b n i nie dzielą się k - b k dla dowolnej liczby całkowitej dodatniej k <n , z następującymi wyjątkami: [rzeczy, które nie stosują tutaj].

Rozważ czasy powtórzeń 9: to znaczy 10 n -1 . Według Twierdzenia Zsigmondy'ego o a = 10 , b = 1 , istnieje pewna liczba pierwsza p | 10 n -1, które nie dzieli żadnych 10 k -1 , k <n .

  • Ponieważ p jest liczbą pierwszą, a 10 n -1 = 9 · R n , musi on podzielić albo 9, albo R n .

  • p nie może podzielić 9 , ponieważ 9 = 10 1 -1 .

  • Dlatego p dzieli R n .

  • P nie można podzielić każdą R k , ponieważ nie dzieli 10 k -1 = 9 · R k .

Dlatego p z twierdzenia Zsigmondy'ego jest nowym czynnikiem podstawowym dowolnego R n , n ≥ 2 . ∎


Przykład powtarzającego się nowego czynnika podstawowego

Liczba pierwsza 487 jest wielokrotnością liczby pierwszej R 486 :

Według twierdzenia Fermata-Eulera, 10 487-1 ≡ 1 (mod 487) . Kolejność 10 mod 487, czyli najmniejsza potęga 10, czyli 1 mod 487, musi więc być dzielnikiem 486. W rzeczywistości kolejność wynosi 486. Zdarza się również, że nie tylko 10 486 ≡ 1 (mod 487) , jest to również 1 (mod 487 2 ) .

Zobacz tutaj, że kolejność 10 mod 487 wynosi 486; to znaczy, że nie mniej niż 10 tys -1 można podzielić przez 487. Oczywiście 487 nie dzieli 9, więc musi podzielić R 486 .


6

CJam, 18 bajtów

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

Sprawdź to tutaj.

Począwszy od 19 (pierwsza liczba powtórzeń po 2) potrwa dość długo.

Wyjaśnienie

Jest to blok bez nazwy (odpowiednik funkcji CJam), który oczekuje numeru wejściowego nna stosie i pozostawia listę głównych czynników:

{      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
Czy ... poważnie grałeś w golfa od 20 do 16 w ciągu ostatnich trzech minut? >.>
AdmBorkBork

@TimmyD W pewnym sensie ... musiałem jeszcze raz przejść do 18, ponieważ okazało się, że mój kod opiera się na założeniu, którego nie mogę teraz udowodnić ani obalić.
Martin Ender,

Ooo, to ciekawy przypadek - powielać nowe czynniki. Dobry chwyt.
AdmBorkBork,

4

Haskell 86 bajtów

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

Przykład użycia: f 8-> [73,137].

Dużo zajmuje dużo czasu i pamięci n.

Bezpośrednie wdrożenie definicji: wziąć wszystkich czynników xod Rnktórych nie pojawi się wcześniej ( f=<<[1..n-1]są wszystkie czynniki pierwsze R1 ... R(n-1)).


3

Mathematica 82 74 63 bajty

Z 11 bajtami zaoszczędzonymi dzięki alephalpha.

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

Czynniki pierwsze R70

(10 ^ 70-1) / 9 = 1111111111111111111111111111111111111111111111111111111111111111111111

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


Nowe czynniki pierwsze R70

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

{4147571, 265212793249617641}


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

Prosimy wyjaśnić znaczenie [[;;,;;,1]]lub [[1 ;; All, 1 ;; All, 1]]. Jestem zdziwiony!
DavidC

@DavidCarraher Pobiera pierwszy element każdego elementu każdego elementu listy.
LegionMammal978

@DavidCarraher [[;;,;;,1]]jest taki sam jak [[All,All,1]].
alephalpha

To ma sens. BTW, Twoja zmiana lokalizacji Rangebyła bardzo sprytna.
DavidC

2

MATL , 25 bajtów

Działa to dla danych wejściowych do 16:

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

Następująca wersja wykorzystuje 31 bajtów i działa do 18. Dla 19wymaga około 4 GB pamięci (nie udało się go uruchomić).

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

Przykład

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

Wyjaśnienie

Rozważ wprowadzenie konkretności 6. Najpierw 111111obliczane są główne dzielniki ; w tym przypadku wyniki są 3, 7, 11, 13, 37. Wtedy operacja modulo (podział reszta) oblicza się dla wszystkich kombinacji liczb 1, 11... 111111i obliczone dzielnikami. Wykorzystuje to ukrytą ekspansję MATL-a. Wynik jest w tym przypadku macierzą 6x 5, przy czym każda kolumna odpowiada jednemu z dzielników. Akceptowane dzielniki (kolumny) to te, dla których tylko 1wartość (a mianowicie ostatnia) daje zero pozostałej.

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

(*) Usunięto w krótkiej wersji


To sprytny sposób na zrobienie tego.
AdmBorkBork,

2

Julia, 103 bajty

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

Jest to nienazwana funkcja, która wywołuje funkcję pomocnika R. Aby go wywołać, nadaj głównej funkcji nazwę, npf=n->... .

Nie golfowany:

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 Prymitywy

19 trwa wiecznie ...

Pracuj, zapisując wszystkie liczby pierwsze i usuwając elementy z ostatniego zestawu, gdy zostaną znalezione w drugiej tablicy.


1

J, 24 bajty

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

Oczekuje liczb o rozszerzonej precyzji po 6 (np. 19xZamiast 19).

Wypróbuj online!

Prawdopodobnie istnieje krótszy sposób generowania powtórek, który pozwala również uniknąć limitów.

Wyjaśnienie

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

Jak to działa wizualnie

Myślę, że tego rodzaju wizualne wyjaśnienia są łatwiejsze do zniesienia dla tych, którzy nie znają J. To są wyniki 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.