Trova il primo più grande che è ancora un numero primo dopo l'eliminazione delle cifre


19

Su /math/33094/deleting-any-digit-yields-a-prime-is-there-a-name-for-questa è la seguente domanda. Quanti numeri primi rimangono primi dopo aver eliminato una delle sue cifre? Ad esempio 719è un numero primo come si ottiene 71, 19e 79. Mentre questa domanda è irrisolta, ho pensato che fosse una bella sfida per la programmazione.

Compito. Dai il primo più grande che riesci a trovare che rimane un numero primo dopo aver eliminato una delle sue cifre. Dovresti anche fornire il codice che lo trova.

Punto. Il valore del numero primo che dai.

Puoi usare qualsiasi linguaggio di programmazione e librerie che ti piacciono purché siano gratuiti.

Per iniziare, 99444901133è il più grande dato sulla pagina collegata.

Limite di tempo. Accetterò la risposta corretta più grande data esattamente una settimana dopo la prima risposta corretta più grande di quella 99444901133fornita in una risposta.

I punteggi finora.

Python (primo)

4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111

J (randomra) (Questa risposta ha avviato il timer di una settimana il 21 febbraio 2013.)

222223333333

9901444133(una cancellazione di un 9) non è prime ( 7 x 1414492019). Il tuo esempio precedente era corretto, però.
primo

@primo Grazie, risolto. Era un mio strano errore di battitura.
motl7,

1
Se ce n'è uno più grande - come sembra indicare l'analisi, mi chiedo come potresti fare una prova quando pensi di averla trovata.
Gnibbler,

1
E le altre basi? Nella base 2, non sono riuscito a trovare nulla di più alto di 11 (2r1011), 11 anche nella base 3 (3r102), 262151 nella base 4 (4r1000000013), 17 nella base 5 (5r32), 37 nella base 7 (7r52), 47 nella base 9 (9r52).
aka.nice

Risposte:


17

274 cifre

4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111

Questa operazione ha richiesto circa 20 ore di tempo CPU e circa 2 minuti per prime per dimostrarlo. Al contrario, la soluzione a 84 cifre si trova in circa 3 minuti.

84 cifre

444444444444444444444444444444444444444444444444441111111113333333333333333333333333

77777777999999999999999777777777 (32 cifre)
66666666666666622222222222222333 (32 cifre)
647777777777777777777777777 (27 cifre)
44444441333333333333 (20 cifre)
999996677777777777 (18 cifre)
167777777777777 (15 cifre)

Consiglio questo strumento se si desidera confermare la primalità: D. Alpern's ECM Applet

Anche usando un approccio di riprogettazione, che sembra essere l'approccio che molto probabilmente trova grandi valori. Il seguente script salta algoritmicamente sulla maggior parte dei numeri o troncamenti, il che si tradurrà in multipli di 2, 3, 5 e ora 11 c / o PeterTaylor (il suo contributo ha aumentato l'efficienza di circa il 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.pypuò essere trovato qui: http://codepad.org/KtXsydxK
In alternativa, è possibile utilizzare anche la gmpy.is_primefunzione: Progetto GMPY

Alcuni piccoli miglioramenti della velocità a seguito della profilazione. Il controllo di primalità per il più lungo dei quattro candidati è stato spostato alla fine, xrangesostituisce rangee longsostituisce i intcast di tipo. intsembra avere un sovraccarico non necessario se l'espressione valutata risulta in a long.


Regole di divisibilità

Lasciate N sia un numero intero postitive della forma un ... ab ... bc ... c , dove un , b e c sono ripetute cifre.

Per 2 e 5
- Per evitare la divisibilità per 2 e 5 , c potrebbe non essere nell'insieme [0, 2, 4, 5, 6, 8] . Inoltre, se b è un membro di questo set, la lunghezza di c non può essere inferiore a 2.

Per 3
- Se N = 1 (mod 3) , allora N non può contenere nessuno di [1, 4, 7] , poiché la rimozione di uno di questi comporterebbe banalmente un multiplo di 3 . Allo stesso modo per N = 2 (mod 3) e [2, 5, 8] . Questa implementazione usa una forma leggermente indebolita di questo: se N contiene uno di [1, 4, 7] , non può contenere nessuno di [2, 5, 8] e viceversa. Inoltre, N non può consistere esclusivamente in [0, 3, 6, 9] . Questa è in gran parte un'affermazione equivalente, ma consente alcuni casi banali, ad esempio a , b e cognuno viene ripetuto un multiplo di 3 volte.

Per 11
- Come osserva PeterTaylor , se N è nella forma aabbcc ... xxyyzz , ovvero consiste solo di cifre ripetute un numero pari di volte, è banalmente divisibile per 11 : a0b0c ... x0y0z . Questa osservazione elimina metà dello spazio di ricerca. Se N è di lunghezza dispari, allora la lunghezza di un , b e c devono essere tutti dispari così (riduzione dello spazio di ricerca 75%), e se N è di lunghezza pari, allora solo uno di una , b o c possono essere ancora di lunghezza (riduzione dello spazio di ricerca del 25%).
- Congettura: Se abc è un multiplo di 11 , per esempio 407 , allora tutte le ripetizioni dispari di un , b e c saranno anche multipli di 11 . Ciò non rientra nell'ambito della suddetta divisibilità per 11 regola; infatti, solo le ripetizioni dispari sono tra quelle che sono esplicitamente consentite. Non ne ho una prova, ma i test sistematici non sono stati in grado di trovare un contro-esempio. Confronta: 444077777 , 44444000777 , 44444440000077777777777 , ecc. Chiunque può sentirsi libero di provare o confutare questa congettura. da allora aditsu ha dimostrato che ciò è corretto.


Altre forme

2 serie di cifre ripetute I
numeri della forma che casualmente stava perseguendo, a ... ab ... b , sembrano essere molto più rari. Ci sono solo 7 soluzioni in meno di 10 1700 , la più grande delle quali è di 12 cifre.

4 serie di cifre ripetute I
numeri di questo modulo, a ... ab ... bc ... cd ... d , sembrano essere distribuiti in modo più denso di quelli che stavo cercando. Ci sono 69 soluzioni in meno di 10 100 , rispetto alle 32 che utilizzano 3 serie di cifre ripetute. Quelli tra 10 11 e 10 100 sono i seguenti:

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

C'è un semplice argomento euristico sul perché questo dovrebbe essere il caso. Per ogni lunghezza digitale, esiste un numero di set ripetuti (ovvero 3 set ripetuti o 4 set ripetuti, ecc.) Per i quali il numero previsto di soluzioni sarà il più alto. La transizione si verifica quando il numero di ulteriori possibili soluzioni, considerato come un rapporto, supera la probabilità che il numero aggiuntivo da controllare sia primo. Data la natura esponenziale delle possibilità di controllo e la natura logaritmica della distribuzione dei numeri primi, ciò avviene relativamente rapidamente.

Se, ad esempio, volessimo trovare una soluzione a 300 cifre, il controllo di 4 serie di cifre ripetute sarebbe molto più probabile che produca una soluzione rispetto a 3 serie e 5 serie sarebbe ancora più probabile. Tuttavia, con la potenza di calcolo che ho a disposizione, trovare una soluzione molto più grande di 100 cifre con 4 set sarebbe al di fuori della mia capacità, figuriamoci 5 o 6.


3
Qualsiasi soluzione del modulo d^x e^y f^zrichiede che almeno due delle lunghezze della sequenza siano dispari per evitare la divisibilità per 11. Non so se is_primerifiuterò multipli di 11 abbastanza rapidamente da rendere questo valore non esplicitamente preso in considerazione.
Peter Taylor,

Non ho la fonte gmp di fronte a me, ma molto probabilmente inizia con la divisione di prova su piccoli numeri primi. Tuttavia, (na&1)+(nb&1)+(nc&1) > 1è abbastanza semplice che dovrebbe essere più veloce. Aspetta un minuto, questo può curvare i rami pieni! Se naè pari ed nb + ncè dispari, uno di [nb, nc]deve essere necessariamente pari e puoi semplicemente passare al successivo na.
primo

Fai attenzione se stai usando gmpy.is_prime (). Oltre un certo punto è probabilistico, quindi è necessario verificare che restituisca a 2. 1significa che è probabilmente solo un primo
gnibbler

4
Un test diretto ed esatto per la divisibilità per 11 è quello di aggiungere tutte le cifre in posizioni pari e sottrarre tutte le cifre in posizioni dispari (o viceversa) e verificare se il risultato è un multiplo di 11. Come corollario (ma può anche essere dedotto direttamente), puoi ridurre tutte le sequenze di 2+ cifre identiche a 0 o 1 cifre (prendendo la lunghezza della sequenza% 2). 44444440000077777777777 si riduce quindi a 407; 4 + 7-0 = 11. 4444444444444444444444444444444444444444444444444411111111133333333333333333333333333333 si riduce a 13.
aditsu,

1
"robusto"! = provato. La differenza non è importante per alcuni, cruciale per altri. PrimeQ in Mathematica è una variante BPSW più un MR aggiuntivo con base 3, quindi ovviamente ci vorranno solo un paio di millisecondi. Pari / GP dimostra il numero di 274 cifre usando APR-CL in circa 3 secondi su un computer di 5 anni e l'ECPP open-core single-core impiega circa 2 secondi. Nessuna sorpresa ci vuole più tempo per Java, ma non è un grosso problema. Ho avuto la mia traduzione in Perl di questo BPSW su tutti e 4, quindi una prova su tutti e 4 solo se tutti hanno superato i test economici.
DanaJ,

5

222223333333 (12 cifre)

Qui ho cercato solo un formato aa..aabb..bb fino a 100 cifre. Solo gli altri colpi sono 23 37 53 73 113 311.

Codice J (pulito) (scusate, nessuna spiegazione):

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

Una ricerca esaustiva di questo modulo fino a 1560 cifre (e conteggi) non rivela nulla di più grande di questa soluzione a 12 cifre.
primo

2

Modifica: qualcuno ha già fatto un'analisi più approfondita di quanto non abbia fatto qui.

Non una soluzione ma una stima approssimativa del numero di soluzioni a n cifre.

Numero stimato di soluzioni

Generazione del codice J.

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

Grazie. L'asse y è un po 'confuso. Intendi davvero 10 ^ -100 come il numero stimato di soluzioni con circa 86 cifre?
motl7,

Sì. Se esiste un numero finito di soluzioni, è credibile. Sebbene sulla base dei dati esistenti questa stima sia un po 'off perché le cifre ripetute creano una correlazione tra i numeri con una cifra in meno.
randomra,

1
Qualcuno ha già fatto un'analisi più approfondita rispetto a I.
randomra,

L'asse y è la proporzione di numeri con cifre x che sono soluzioni? Questo è il numero di soluzioni diviso per 10 ^ (# cifre)? Non può essere il numero in quanto simile a 4, 11 ecc. E il registro è quasi sempre superiore a 1.
motl7

1

Javascript (Brute Force)

Non ha ancora trovato un numero più alto

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

Senza una libreria bigint, javascript è limitato a numeri interi <= 2^53.

Dato che è Javascript, il browser si lamenterà se non rilasciamo il thread di esecuzione per l'aggiornamento dell'interfaccia utente, di conseguenza, ho deciso di tracciare dove si trova l'algoritmo nella sua progressione nell'interfaccia utente.

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 Ci sono grandi librerie int per js ma questo metodo di forza bruta sembra condannato.
motl7,

1
@ motl7 D'accordo, lasciato in esecuzione tutta la notte e non sono state trovate risposte.
Shmiddty,

1

È stato pubblicato un collegamento ad un'analisi del problema, ma ho pensato che mancassero alcune cose. Diamo un'occhiata a numeri di m cifre, costituite da k sequenze di 1 o più cifre identiche. È stato dimostrato che se dividiamo le cifre nei gruppi {0, 3, 6, 9}, {1, 4, 7} e {2, 5, 8}, una soluzione non può contenere cifre sia del secondo che del terzo gruppo e deve contenere 3n + 2 cifre di uno di questi gruppi. Almeno due delle sequenze k devono avere un numero dispari di cifre. Delle cifre {1, 4, 7} solo 1 e 7 possono essere la cifra più bassa. Nessuna di {2, 5, 8} può essere la cifra più bassa. Quindi ci sono quattro (1, 3, 7, 9) o due (3, 9) scelte per la cifra più bassa,

Quanti candidati ci sono? Abbiamo m cifre divise in k sequenze di almeno 1 cifra. Ci sono (m - k + 1) su (k - 1) modi per scegliere le lunghezze di queste sequenze, che è di circa (m - 1.5k + 2) ^ (k - 1) / (k - 1) !. Sono disponibili 2 o 4 scelte per la cifra più bassa, sei in totale. Sono disponibili sei opzioni per le altre cifre, ad eccezione di 36/7 per la cifra più alta; il totale è (6/7) * 6 ^ k. Ci sono 2 ^ k modi per scegliere se la lunghezza di una sequenza è pari o dispari; k + 1 di questi sono esclusi perché nessuno o solo uno è dispari; moltiplichiamo il numero di scelte per (1 - (k + 1) / 2 ^ k), che è 1/4 quando k = 2, 1/2 quando k = 3, 11/16 quando k = 4 ecc. Il numero di cifre dall'insieme {1, 4, 7} o {2, 5, 8} deve essere 3n + 2, quindi il numero di scelte viene diviso per 3.

Moltiplicando tutti questi numeri, il numero di candidati è

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

o

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

Il candidato stesso e i numeri k che vengono creati rimuovendo una cifra devono essere tutti numeri primi. La probabilità che un numero intero casuale attorno a N sia primo è di circa 1 / ln N. La probabilità di un numero casuale di cifre m è di circa 1 / (m ln 10). Tuttavia, i numeri qui non sono casuali. Sono stati tutti scelti per non essere divisibili per 2, 3 o 5. 8 su 30 numeri interi consecutivi non sono divisibili per 2, 3 o 5. Pertanto, la probabilità di essere un numero primo è (30/8) / (mnn 10) o circa 1.6286 / m.

Il numero previsto di soluzioni è di circa

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

o per grandi m circa

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

Per k = 2, 3, 4, ... otteniamo quanto segue:

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

Da k = 10 in poi, il numero diventa di nuovo più piccolo.


5
Benvenuti in PPCG! Questa è un'analisi eccellente; tuttavia, cerchiamo risposte come risposte legittime alla domanda. In altre parole, codice. Sfortunatamente, questo lascia poco spazio nella nostra struttura per i post di solo commento, che sono relegati ai commenti post. Tuttavia, odierei vedere uno sforzo così approfondito essere relegato nel nostro mucchio di fanghiglia, quindi vorrei suggerire che se aggiungessi un programma per computer progettato per rispondere ai requisiti della sfida al tuo post, sarebbe più probabile che venga mantenuto in giro.
Jonathan Van Matre,

1
Inoltre, ti consiglio vivamente di visitare i nostri siti gemelli : math.stackexchange.com e mathoverflow.net
Jonathan Van Matre,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.