2^0 = 1 = 1 mod 5
2^1 = 2 = 2 mod 5
2^2 = 4 = -1 mod 5
2^3 = 8 = -2 mod 5
2^4 = 16 = 1 mod 5
2^5 = 32 = 2 mod 5
... -1 mod 5
... -2 mod 5
Quindi abbiamo un modello 1, 2, -1, -2. Esistono due subpatterns in cui solo il segno del numero si alterna: Let n è il numero di cifre e il numero della cifra meno significativa è 0; modello dispari è
(-1)^(n)
e anche modello è
2x((-1)^(n))
Così, come utilizzare questo?
Lascia che il numero originale sia 100011, dividi le cifre dei numeri in due parti, pari e dispari. Sommare le cifre di ciascuna parte separatamente. Moltiplicare la somma delle cifre dispari per 2. Ora, se il risultato è divisibile per somma delle cifre pari, allora il numero originale è divisibile per 5, altrimenti non è divisibile. Esempio:
100011
1_0_1_ 1+0+1 = 2
_0_0_1 0+0+1 = 1; 1x2 = 2
2 mod(2) equals 0? Yes. Therefore, original number is divisible.
Come applicarlo all'interno di un'espressione regolare? Utilizzando le funzioni callout all'interno di un'espressione regolare può essere applicato. I callout forniscono un mezzo per passare temporaneamente il controllo allo script nel mezzo della corrispondenza del modello di espressioni regolari.
Tuttavia, la risposta di ndn è più appropriata e più semplice, quindi consiglio di usare la sua risposta.
Mostraci cosa hai provato e come non funziona. –
non so da dove iniziare perché i numeri sono molto diversi: 0101, 1010, 1111, 10100 ... non esiste una regola speciale da applicare –
I criteri di divisibilità Pascal generalizzati danno una sequenza ridotta di (1, 2, 4, 3, 1, ...) e difficilmente riesco a vedere come questo possa essere utilizzato dalla regex.Tuttavia, se il tuo obiettivo finale è solo quello di verificare un enorme numero binario per divisibilità, puoi utilizzarlo direttamente. È sufficiente passare il numero da cifre multiple di cifre più basse su numeri di sequenza e raccolta totale. Il resto del totale è il resto del numero iniziale. Questo è il miglior collegamento che ho trovato finora http://mathworld.wolfram.com/DivisibilityTests.html –