Знайдіть найбільший прайм, який досі залишається простим після видалення цифр


19

На /math/33094/deleting-any-digit-yields-a-prime-is-there-a-name-для цього задається наступне питання. Скільки є простих простирадлів, які залишаються простими після видалення будь-якої з її цифр? Наприклад 719, такий розквіт, як ви отримуєте 71, 19і 79. Незважаючи на те, що це питання не вирішено, я вважав, що це приємне завдання кодування.

Завдання. Дайте найбільший простір, який можна виявити, що залишається простим, коли ви видалите будь-яку з його цифр. Ви також повинні надати код, який його знаходить.

Оцінка. Значення премії, яку ви даєте.

Ви можете використовувати будь-яку мову програмування та бібліотеки, які вам подобаються, якщо вони безкоштовні.

Для початку речі 99444901133- це найбільший розміщений на пов’язаній сторінці.

Термін. Я прийму найбільшу правильну відповідь, дану рівно через тиждень після того, як перша правильна відповідь більша, ніж 99444901133у відповіді.

Оцінки поки що.

Пітон (прима)

4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111

J (randomra) (Ця відповідь розпочалася однотижневим таймером 21 лютого 2013 р.)

222223333333

9901444133(видалення одного 9) не є простим ( 7 x 1414492019). Однак ваш попередній приклад був правильним.
— примо

@primo Спасибі, виправлено. Це було дивне друкарство.
— motl7

1
Якщо є найбільший - як здається, аналіз показує, мені цікаво, як ви могли б отримати доказ, коли думаєте, що знайшли його.
— гніблер

1
Що з іншими базами? У базі 2 я не міг знайти нічого вищого за 11 (2r1011), 11 також в базі 3 (3r102), 262151 в базі 4 (4r1000000013), 17 в базі 5 (5r32), 37 в базі 7 (7r52), 47 в базі 9 (9р52).
— aka.nice

Відповіді:


17

274 цифри

4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111

На це знадобилося близько 20 годин процесорного часу, і на те, щоб довести приблизно 2 хвилини за першості. Навпаки, 84-розрядне рішення можна знайти приблизно за 3 хвилини.

84 цифри

444444444444444444444444444444444444444444444444441111111113333333333333333333333333

77777777999999999999999777777777 (32 цифри)
66666666666666622222222222222333 (32 цифри)
64777777777777777777777777777 (27 цифр)
4444444133333333333333 (20 цифр)
999996677777777777 (18 цифр)
1677777777 ( 17 цифр) 1677777777

Я рекомендую цей інструмент, якщо ви хочете підтвердити первинність: аплет Д. Алперна ECM

Також з використанням репідгітального підходу, який, схоже, підхід найімовірніше знайде великі значення. Наступний алгоритм алгоритмічно пропускає більшість чисел або скорочень, що призведе до кратності 2, 3, 5 і тепер 11 c / o PeterTaylor (його внесок підвищив ефективність приблизно на 50%).

from my_math import is_prime

sets = [
 (set('147'), set('0147369'), set('1379')),
 (set('369'), set('147'), set('1379')),
 (set('369'), set('0369'), set('17')),
 (set('258'), set('0258369'), set('39')),
 (set('369'), set('258'), set('39'))]

div2or5 = set('024568')

for n in range(3, 100):
 for sa, sb, sc in sets:
  for a in sa:
   for b in sb-set([a]):
    bm1 = int(b in div2or5)
    for c in sc-set([b]):
     if int(a+b+c)%11 == 0: continue
     for na in xrange(1, n-1, 1+(n&1)):
      eb = n - na
      for nb in xrange(1, eb-bm1, 1+(~eb&1)):
       nc = eb - nb
       if not is_prime(long(a*(na-1) + b*nb + c*nc)):
        continue
       if not is_prime(long(a*na + b*(nb-1) + c*nc)):
        continue
       if not is_prime(long(a*na + b*nb + c*(nc-1))):
        continue
       if not is_prime(long(a*na + b*nb + c*nc)):
        continue
       print a*na + b*nb + c*nc

my_math.pyВи можете знайти тут: http://codepad.org/KtXsydxK
Як варіант, ви також можете використовувати gmpy.is_primeфункцію: GMPY Project

Деякі невеликі покращення швидкості в результаті профілювання. Перевірка первинності для найдовшого з чотирьох кандидатів переміщена до кінця, xrangeзамінює rangeі longзамінює intкасти типу. intЗдається, зайві накладні витрати, якщо оцінений вираз призводить до а long.


Правила поділу

Нехай N - позитивне ціле число форми a ... ab ... bc ... c , де a , b і c - повторювані цифри.

За 2 та 5
- Щоб уникнути поділу на 2 та 5 , c може бути у множині [0, 2, 4, 5, 6, 8] . Крім того, якщо b є членом цього набору, довжина c може бути не менше 2.

За 3
- Якщо N = 1 (mod 3) , то N може не містити жодного з [1, 4, 7] , оскільки видалення будь-якого з них тривіально призведе до кратного 3 . Аналогічно для N = 2 (mod 3) та [2, 5, 8] . Ця реалізація використовує дещо ослаблену форму цього: якщо N містить один із [1, 4, 7] , він може не містити жодного з [2, 5, 8] , і навпаки. Крім того, N не може складатися виключно з [0, 3, 6, 9] . Це значною мірою еквівалентне твердження, але воно допускає деякі тривіальні випадки, наприклад, a , b і cкожен повторюється кратно 3 рази.

До 11
- Як зазначає ПетерТейлор , якщо N має форму aabbcc ... xxyyzz , тобто складається лише з цифр, повторених парне число разів, це тривіально ділиться на 11 : a0b0c ... x0y0z . Це спостереження усуває половину простору пошуку. Якщо N має непарну довжину, то довжина a , b і c також повинна бути непарною (75% зменшення простору пошуку), а якщо N має парну довжину, то лише одна з a , b або c може бути парною в довжину (зменшення на 25% пошукового простору).
- Концепція: якщо abc кратне 11 , наприклад 407 , то всі непарні повторення a , b і c також будуть кратними 11 . Це випадає із сфери застосування вищезазначеного поділу за правилами 11 ; насправді серед тих, які явно дозволені, є лише непарні повтори. Я не маю доказів цьому, але систематичне тестування не змогло знайти зустрічний приклад. Порівняйте: 444077777 , 44444000777 , 44444440000077777777777 тощо. Будь-хто може сміливо доводити або спростувати цю гіпотезу. aditsu з тих пір продемонстрував, що це правильно.


Інші форми

2 набори повторних цифр
Числа форми, яку переслідували випадкові , a ... ab ... b , здаються набагато рідшими . Існує лише 7 рішень менше 10 1700 , найбільший з яких - 12 цифр.

4 набори повторних цифр
Числа цієї форми, a ... ab ... bc ... cd ... d , здаються більш щільними, ніж ті, що я шукав. Є 69 рішень менше 10 100 порівняно з 32, що використовують 3 набори повторних цифр. Ті, від 10 11 до 10 100 , такі:

190000007777
700000011119
955666663333
47444444441111
66666622222399
280000000033333
1111333333334999
1111333333377779
1199999999900111
3355555666999999
2222233333000099
55555922222222233333
444444440004449999999
3366666633333333377777
3333333333999888883333
4441111113333333333311111
2222222293333333333333999999
999999999339999999977777777777
22222226666666222222222299999999
333333333333333333339944444444444999999999
559999999999933333333333339999999999999999
3333333333333333333111111111111666666666611111
11111111333330000000000000111111111111111111111
777777777770000000000000000000033333339999999999999999999999999
3333333333333333333333333333333333333333333333336666666977777777777777
666666666666666666611111113333337777777777777777777777777777777777777777
3333333333333333333888889999999999999999999999999999999999999999999999999933333333

Існує простий евристичний аргумент, чому так має бути. Для кожної цифрової довжини існує ряд повторюваних наборів (тобто 3 повторюваних набору, або 4 повторних набору тощо), для яких очікувана кількість рішень буде найбільшою. Перехід відбувається, коли кількість додаткових можливих рішень, прийнятих як співвідношення, переважає ймовірність того, що додаткове число, яке слід перевірити, є простим. Враховуючи експоненціальний характер можливостей перевірки та логарифмічний характер розподілу простих чисел, це відбувається відносно швидко.

Якби, наприклад, ми хотіли знайти 300-розрядне рішення, перевірка 4-х наборів повторних цифр була б набагато частіше виробити рішення, ніж 3-х наборів, а 5 наборів було б імовірніше все-таки. Однак, маючи в своєму розпорядженні обчислювальною потужністю, знайти рішення, набагато більше 100 цифр з 4 наборами, було б поза моїми можливостями, не кажучи вже про 5 або 6.


3
Будь-яке рішення форми d^x e^y f^zвимагає, щоб принаймні дві довжини послідовностей були непарними, щоб уникнути поділу на 11. Я не знаю, чи is_primeвідхилять кратні 11 досить швидко, щоб зробити це не варто явно враховувати.
— Пітер Тейлор

Я не маю перед собою джерела gmp, але це, швидше за все, починається з пробного поділу на невеликі праймери. І все-таки (na&1)+(nb&1)+(nc&1) > 1досить проста, що повинна бути швидшою. Зачекайте хвилинку, це може коротко скоротити повноцінні гілки! Якщо naпарне і nb + ncнепарне, то одна з [nb, nc]обов'язково повинна бути парною, і ви можете просто перейти до наступної na.
— примо

Будьте уважні, якщо ви використовуєте gmpy.is_prime (). Поза певним моментом він є ймовірнісним, тому вам потрібно перевірити його повернення a 2. 1значить, це лише ймовірно прем'єр
— гніблер

4
Прямий і точний тест на подільність на 11 полягає в тому, щоб додати всі цифри в парних позиціях і відняти всі цифри в непарних позиціях (або навпаки) і перевірити, чи результат є кратним 11. Як висновок (але також може бути виведено безпосередньо), ви можете зменшити всі послідовності 2+ однакових цифр до 0 або 1 цифр (приймаючи довжину послідовності% 2). 44444440000077777777777 таким чином зменшується до 407; 4 + 7-0 = 11. 4444444444444444444444444444444444444444444444441111111113333333333333333333333333 зменшується до 13.
— aditsu

1
"міцний"! = перевірений. Різниця не важлива для одних, важлива для інших. PrimeQ в Mathematica - це варіант BPSW плюс додатковий ЗР з базою 3, тому, звичайно, це займе лише пару мілісекунд. Pari / GP доводить 274-значний номер за допомогою APR-CL приблизно за 3 секунди на 5-річному комп'ютері, а одноядерний ECPP з відкритим кодом займає близько 2 секунд. Не дивно, що для Java це займає більше часу, але це не велика справа. У мене був переклад цього Perl на BPSW на всіх 4, то доказ на всіх 4, тільки якщо вони всі здали дешеві тести.
— DanaJ

5

222223333333 (12 цифр)

Тут я шукав лише формат aa..aabb..bb до 100 цифр. Лише інші хіти - 23 37 53 73 113 311.

J-код (очищено) (вибачте, без пояснень):

a=.>,{,~<>:i.100
b=.>,{,~<i.10
num=.".@(1&":)@#~
p=.(*/"1@:((1&p:)@num) (]-"1(0,=@i.@#)))"1 1
]res=./:~~.,b (p#num)"1 1/ a

Вичерпний пошук цієї форми до 1560 цифр (і підрахунок) не виявляє нічого більшого, ніж це 12-значне рішення.
— примо

2

Редагувати: хтось уже робив глибший аналіз, ніж я тут.

Не рішення, а приблизна оцінка кількості розрядів n-значних.

Орієнтовна кількість рішень

Генерування J-коду

   ops=: 'title ','Estimated number of solutions by digits',';xcaption ','digits',';ycaption ','log10 #'
   ops plot 10^.((%^.)%(2&(%~)@^.@(%&10))^(10&^.))(10&^(2+i.100))

Спасибі. Вісь y трохи заплутана. Ви дійсно маєте на увазі 10 ^ -100 як орієнтовна кількість рішень з приблизно 86 цифрами?
— motl7

Так. Якщо існує кінцева кількість рішень, це правдоподібно. Незважаючи на те, що на основі наявних даних, ця оцінка дещо відхилена, оскільки повторення цифр створює кореляцію між числами з однією меншою цифрою.
— randomra

1
Хтось уже робив глибший аналіз, ніж я
— випадковість,

Чи є вісь у співвідношенні чисел із x цифрами, що є рішеннями? Це кількість рішень, поділене на 10 ^ (# цифр)? Це не може бути число, яке виглядає як 4, 11 і т.д., і лог цього майже завжди вище 1.
— motl7

1

Javascript (Brute Force)

Більше не знайшло більшої кількості

http://jsfiddle.net/79FDr/4/

Без бібліотеки bigint javascript обмежений цілими числами <= 2^53.

Оскільки це Javascript, браузер поскаржиться, якщо ми не випустимо потік виконання оновленого інтерфейсу для оновлення, в результаті я вирішив відстежити, де алгоритм просувається в інтерфейсі.

function isPrime(n){
    return n==2||(n>1&&n%2!=0&&(function(){
        for(var i=3,max=Math.sqrt(n);i<=max;i+=2)if(n%i==0)return false;
        return true;
    })());
};

var o=$("#o"), m=Math.pow(2,53),S=$("#s");

(function loop(n){
    var s = n.toString(),t,p=true,i=l=s.length,h={};
    if(isPrime(n)){
        while(--i){
            t=s.substring(0,i-1) + s.substring(i,l); // cut out a digit
            if(!h[t]){   // keep a hash of numbers tested so we don't end up testing 
                h[t]=1;  // the same number multiple times
                if(!isPrime(+t)){p=false;break;}
            }
        }
        if(p)
            o.append($("<span>"+n+"</span>"));
    }
    S.text(n);
    if(n+2 < m)setTimeout(function(){
        loop(n+2);
    },1);
})(99444901133);

@Schmiddty Є великі бібліотеки Int для js, але цей метод грубої сили здається приреченим.
— motl7

1
@ motl7 Погодився, залишив його працювати всю ніч, і відповіді не знайдено.
— Шміддті

1

Було розміщено посилання на аналіз проблеми, але я подумав, що в ньому відсутні кілька речей. Давайте розглянемо числа m цифр, що складаються з k послідовностей з 1 або більше однакових цифр. Було показано, що якщо ми розділимо цифри на групи {0, 3, 6, 9}, {1, 4, 7} і {2, 5, 8}, рішення не може містити цифр як другої, так і третьої групи , і він повинен містити 3n + 2 цифри від однієї з цих груп. Принаймні дві k послідовності повинні мати непарну кількість цифр. З цифр {1, 4, 7} найменшою цифрою можуть бути лише 1 і 7. Жоден з {2, 5, 8} не може бути найнижчою цифрою. Таким чином, є або чотири (1, 3, 7, 9), або два (3, 9) варіанти для найнижчої цифри,

Скільки там кандидатів? У нас є m розрядів, розділених на k послідовності принаймні 1 цифру. Існують (m - k + 1) над (k - 1) способи вибору довжин цих послідовностей, тобто приблизно (m - 1,5k + 2) ^ (k - 1) / (k - 1) !. Існує 2 або 4 варіанти для найнижчої цифри, загалом шість. Для інших цифр є шість варіантів, крім 36/7 вибору для найбільшої цифри; загальна сума (6/7) * 6 ^ k. Є 2 ^ k способи вибрати, чи довжина послідовності є парною чи непарною; k + 1 з них виключаються, оскільки жоден або лише один не є непарними; множимо кількість варіантів на (1 - (k + 1) / 2 ^ k), що становить 1/4, коли k = 2, 1/2, коли k = 3, 11/16, коли k = 4 і т. п. Число цифр із набору {1, 4, 7} або {2, 5, 8} повинно бути 3n + 2, тому кількість варіантів ділиться на 3.

Помноживши всі ці числа, кількість кандидатів є

(m - 1.5k + 2)^(k - 1) / (k - 1)! * (6/7) * 6^k * (1 - (k + 1) / 2^k) / 3

або

(m - 1.5k + 2)^(k - 1) / (k - 1)! * (2/7) * 6^k * (1 - (k + 1) / 2^k)

Сам кандидат і k числа, які створюються шляхом вилучення цифри, повинні бути простими рівнями. Ймовірність того, що випадкове ціле число навколо N є простим, становить приблизно 1 / ln N. Імовірність випадкового m-значного числа приблизно 1 / (m ln 10). Однак числа тут не випадкові. Всі вони були вибрані таким, що не поділяються на 2, 3 або 5. 8 з будь-яких 30 послідовних цілих чисел не ділиться на 2, 3 або 5. Тому ймовірність бути простим (30/8) / (м ln 10) або приблизно 1,6286 / м.

Очікувана кількість рішень приблизно

(m - 1.5k + 2)^(k - 1) / (k - 1)! * (2/7) * 6^k * (1 - (k + 1) / 2^k) * (1.6286 / m)^(k + 1)

або для великих м о

(1 - (1.5k - 2) / m)^(k - 1) / (k - 1)! * 0.465 * 9.772^k * (1 - (k + 1) / 2^k) / m^2

При k = 2, 3, 4, ... отримаємо таке:

k = 2: 11.1 * (1 - 1/m) / m^2
k = 3: 108 * (1 - 2.5/m)^2 / m^2 
k = 4: 486 * (1 - 4/m)^3 / m^2


k = 10: 10,065 * (1 - 13/m)^9 / m^2

Від k = 10 і далі число знову зменшується.


5
Ласкаво просимо до PPCG! Це відмінний аналіз; однак ми шукаємо відповіді, щоб бути законними відповідями на питання. Іншими словами, код. На жаль, це залишає в нашій структурі мізерний простір для публікацій лише для коментарів, які передаються коментарям до публікацій. Однак мені б не хотілося, щоб настільки ретельні зусилля були віднесені до нашої сльотової маси, тому я хотів би натякнути, що якщо ви додасте на свою посаду комп'ютерну програму, розроблену для відповіді на вимоги виклику, вона, швидше за все, буде збережена навколо.
— Джонатан Ван Матре

1
Також настійно рекомендую ознайомитись із нашими сестринськими сайтами: math.stackexchange.com та mathoverflow.net
— Джонатан Ван Матре
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.