Нові основні фактори репунітів


20

Фон

Люди говорили про основну факторизацію в чаті, і ми виявили, що ми говорили про повторні з'єднання. Репуніти - це підмножина чисел, відомих як репдигіти, які є числами, що складаються лише з повторюваних цифр, як-от 222або 4444444444444444, але повторні сукупності складаються лише з 1.

Перша пара repunits, отже 1, 11, 111і т.д. Вони називаються по R п , так що R 1 = 1, R 2 = 11, і т.д., і генеруються за формулою R(n) = (10^n - 1)/9, з n > 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 >= 2допомогою STDIN або еквівалента , виходів або повертаєте нові прості множники для R п , в будь-якому зручному форматі. "Нові прості фактори" тут означають все, 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 балів, якщо хтось докаже чи спростує це у своїй відповіді. Томас Ква запропонував елегантний доказ , і я нагородив щедротою.

Вбудована просте перевірка та факторизація - це чесна гра?
Мартін Ендер

@ 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

Доказ того, що кожне возз’єднання має головний головний фактор

Використовуючи теорему Зігмонджі , доказ простий. З Вікіпедії:

У теорії чисел, теорема Жигмонд, названий в честь Карла Зігмонді, стверджує , що якщо а> Ь> 0 взаємно прості цілі числа, то для будь-якого цілого п ≥ 1 , існує просте число р ( так званий примітивний простий дільник) , який ділить п - b n і не ділить a k - b k на будь-яке додатне ціле число k <n , за такими винятками: [речі, які тут не застосовуються].

Розглянемо повторне з'єднання разів 9: тобто 10 n -1 . За теоремою Зігмонді з a = 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 .

  • Тому р ділить R n .

  • p не може ділити жоден R k , оскільки він не ділить 10 k -1 = 9 · R k .

Тому р з теореми Зігмонді є новим основним фактором будь-якого R n , n ≥ 2 . ∎


Приклад неодноразового основного чинника роману

Простий 487 - це повторний простий коефіцієнт R 486 :

За теоремою Ферма-Ейлера 10 487-1 ≡ 1 (мод 487) . Порядок 10 мод 487, тобто найменша потужність 10, що становить 1 мод 487, тому повинен бути дільником 486. Насправді порядок дорівнює 486. Також буває, що не тільки 10 486 ≡ 1 (мод 487) , це також 1 (мод 487 2 ) .

Дивіться тут, що порядок 10 мод 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 Сорт ... Мені доводилося зараз доходити до 18, оскільки виявилося, що мій код базувався на припущенні, яке я не можу ні доводити, ні спростовувати зараз.
Мартін Ендер

Ооо, це цікавий випадок - копії нових факторів. Гарний улов.
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 байтами збережено завдяки алефальфі.

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

Основні фактори R70

(10 ^ 70 - 1) / 9 = 111111111111111111111111111111111111111111111111111111111111111111111111

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]]&
алефальфа

Уявно поясніть значення [[;;,;;,1]]або [[1 ;; All, 1 ;; All, 1]]. Я спантеличений!
DavidC

@DavidCarraher Він займає перший елемент кожного елемента кожного елемента списку.
LegionMammal978

@DavidCarraher [[;;,;;,1]]те саме, що [[All,All,1]].
алефальфа

Тепер це має сенс. До речі, ваше місцезнаходження Rangeбуло дуже розумним.
DavidC

2

MATL , 25 байт

Це працює для введення до 16:

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

У наступній версії використовується 31 байт і працює до 18. Для 19цього потрібно близько 4 Гб пам'яті (я не зміг її запустити).

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

Юлія, 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->....

Безголівки:

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

19 займає назавжди ...

Працюйте, зберігаючи всі Primes та видаляючи елементи з останнього набору, коли вони знайдені в іншому масиві.


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)

Як це працює, візуально

Я думаю, що такі види візуальних пояснень легше шлунком для тих, хто не знає J. Це результати 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.