Constructing Miller–Rabin Pseudoprimes with SageMath
In this article we implement using SageMath the work of François Arnault Constructing Carmichael Numbers which are Strong Pseudoprimes to Several Bases
The appendix An Overview of Arnault’s Method, from the paper Prime and Prejudice: Primality Testing Under Adversarial Conditions, has also been used as a reference.
First steps
The pseudoprime number that we are going to generate has the form n = p1 · p2 ⋯ ph
.
For convenience we will define h = 3
, resulting in n = p1 · p2 · p3
We must also define the basis this number will pass the Miller–Rabin primality test.
t = {a1,a2,⋯,an}
To recreate the example in the appendix, we will use the primes less than 30.
t = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29}
Sb Residues table
We calculate the table Sb (a⁄p) = -1
def Sb(t):
S = {}
for b in t:
S[b] = []
for p in range(3, 4*b, 2):
if kronecker_symbol(b,p) == -1:
S[b].append(p)
return S
Sb([2, 3, 5, 7, 11, 13, 17, 19, 23, 29])
2: [3, 5]
3: [5, 7]
5: [3, 7, 13, 17]
7: [5, 11, 13, 15, 17, 23]
11: [3, 13, 15, 17, 21, 23, 27, 29, 31, 41]
13: [5, 7, 11, 15, 19, 21, 31, 33, 37, 41, 45, 47]
17: [3, 5, 7, 11, 23, 27, 29, 31, 37, 39, 41, 45, 57, 61, 63, 65]
19: [7, 11, 13, 21, 23, 29, 33, 35, 37, 39, 41, 43, 47, 53, 55, 63, 65, 69]
23: [3, 5, 17, 21, 27, 31, 33, 35, 37, 39, 45, 47, 53, 55, 57, 59, 61, 65, 71, 75, 87, 89]
29: [3, 11, 15, 17, 19, 21, 27, 31, 37, 39, 41, 43, 47, 55, 61, 69, 73, 75, 77, 79, 85, 89, 95, 97, 99, 101, 105, 113]
k2 k3
We must choose k2 and k3 as 2 primes different from the bases used, in practice, greater than the last base.
Later we will analyze how to choose some values in an optimal way, for the moment we will use those of the example: k2 = 41
k3 = 101
Table
From the above table of residuals, we filter by those that satisfy the intersection condition of the sets for i between 1 and h: ki-1(Sb + ki - 1)
k = {1: 1, 2: 41, 3: 101}
def Rt(t, S):
m = {}
B = {}
for b in t:
mod = 4*b
m[b] = {}
for i in range(1, h+1):
m[b][i] = []
inv = inverse_mod(k[i], mod)
for s in S[b]:
sb = ( inv * (s + k[i] -1) ) % mod
m[b][i].append(sb)
B[b] = list(set(m[b][1]).intersection(m[b][2], m[b][3])) # Arreglar para que funcione con h distinto de 3
B[b].sort()
return B
2: [3, 5]
3: [7]
5: [3, 7, 13, 17]
7: [15]
11: [21, 23]
13: [21, 47]
17: [5, 29, 31, 39, 63, 65]
19: [33, 37, 39, 47, 69]
23: [31, 47, 57, 87, 89]
29: [19, 37, 41, 55, 77, 95, 99, 113]
For each base we must choose one of the residues.
Additional conditions
p1 = -k3−1 mod k2
p1 = -k2−1 mod k3
x2 = inverse_mod(-k[3],k[2])
x3 = inverse_mod(-k[2],k[3])
p1 = 28 (mod 41)
p1 = 32 (mod 101)
Chinese Remainder Theorem
Once we have all the constraints in the form p1 = A (mod B) , we use the Chinese remainder theorem (crt
in SageMath).
We do the calculations using the numbers chosen in the example:
crt1 = [3,7,3,15,23,47,31,47,47,55] + [x2, x3]
crt2 = [i * 4 for i in t] + [k[2], k[3]]
p1 = crt(crt1, crt2)
mod = 4* reduce(lambda x, y: x * y, t, 1) * k[2] * k[3]
print("p1 = %d mod %d , k2=%d, k3=%d" % (p1, mod, k[2], k[3]))
We obtain the same result as in the example:
p1 = 36253030834483 mod 107163998661720 , k2=41, k3=101
Choice of residues
The main problem is that when the number of chosen bases increases, so does the complexity of finding compatible residues.
My solution to this problem consists of checking this compatibility progressively, instead of doing it with all the bases simultaneously. In this way, we choose the first residue of each base and if this one is not compatible with the previous ones, we go to the next one, and in case we do not find any compatible one we go back and choose another one in the previous base.
Moreover, in this way, if it is not possible to find compatible residues for all the defined bases, we can obtain a partial solution with a smaller number of bases.
residues = []
Y = {}
X = 0
Y[0] = 0
while True: #for b in t:
if X>=len(t):
break
b = t[X]
while True: #for base in B[b]:
if len(B[b])==0:
print('UNSOLVABLE, try another k2 and k3')
exit()
elif Y[X]>=len(B[b]):
residues.pop()
X -= 1
if X <= 0:
print('UNSOLVABLE, try another k2 and k3')
exit()
break
base = B[b][Y[X]]
residues.append(base)
crt1 = residues + [x2, x3]
crt2 = [i * 4 for i in t[:X+1]] + [k[2], k[3]]
try:
p1 = crt(crt1, crt2)
if X>=5:
mod = 4* reduce(lambda x, y: x * y, t[:X], 1) * k[2] * k[3]
print("%d - p1 = %d mod %d , k2=%d, k3=%d" % (X, p1, mod, k[2], k[3]))
X += 1
Y[X] = 0
break
except:
residues.pop()
Y[X] += 1
continue
The following results are obtained:
5 p1 = 290871043 mod 38262840 , k2=41, k3=101
6 p1 = 1783121803 mod 497416920 , k2=41, k3=101
7 p1 = 86343998203 mod 8456087640 , k2=41, k3=101
8 p1 = 2978325971083 mod 160665665160 , k2=41, k3=101
9 p1 = 106447014334123 mod 3695310298680 , k2=41, k3=101
Improvements
solved = False
residues = []
Y = {0: 0}
X = 0
while True: #for b in t:
if X>=len(t):
residues.pop()
Y[X] = 0
X -= 1
Y[X] += 1
solved = True
continue
b = t[X]
while True: #for base in B[b]:
if len(B[b])==0:
print('UNSOLVABLE, try another k2 and k3')
exit()
elif Y[X]>=len(B[b]):
if X == 0:
if not solved:
print('UNSOLVABLE, try another k2 and k3')
exit()
residues.pop()
Y[X] = 0
X -= 1
Y[X] += 1
break
base = B[b][Y[X]]
residues.append(base)
crt1 = residues + [x2, x3]
crt2 = [i * 4 for i in t[:X+1]] + [k[2], k[3]]
try:
p1 = crt(crt1, crt2)
if X>=5:
mod = 4* reduce(lambda x, y: x * y, t[:X], 1) * k[2] * k[3]
print("%3d - p1 = %d mod %d , k2=%d, k3=%d" % (X, p1, mod, k[2], k[3]))
open("log.txt", "a").write("%3d - p1 = %d mod %d , k2=%d, k3=%d , %s\n" % (X, p1, mod, k[2], k[3], residues))
X += 1
Y[X] = 0
break
except:
residues.pop()
Y[X] += 1
continue
Miller-Rabin pseudoprime
proof.arithmetic(False)
i = -1
D, P1, K2, K3 = 107163998661720, 36253030834483, 41, 101
while True:
i += 1
P = P1 + i * D
if not is_prime(P):
continue
Q = K2 * P - (K2-1)
if not is_prime(Q):
continue
R = K3 * P - (K3-1)
if not is_prime(R):
continue
pseudoprime = P*Q*R
print(pseudoprime)
481121197813453488822072439791414954990651681818044507
6443720759266643520397120277444812868383359470762335147
20344142377169477837040700284941512802799901617537251347
24964597503881043179618771841997687223821360798513204627
29837394232085892643153870380237568644696975862433784787
44313459019486783991509950041785277745503910274192294147
60668428110349406158611956696695902180084285902737804027
91900550475197018427841211222006307477190723489571705587
98024495406750801188170372188698667117004033867329327067
140277264152028217582056560687226797738571162579314652667
183200788011064383003373479584203142739932494189806558307
Miller-Rabin pseudoprime for primes <400
D, P1, K2, K3 = 173008463535598978105335889964045449676769752525364639390267547572932541766933240298753535702993725897270876547514121694726358789414328565199620852636229327034855880, 13690410418353044929368896733658377970427289405478462058496414793357178580977696340960396011434334102235570363541382347819399389941925528029708405522455364960935230643, 401, 421
i = 15793
P = 2746013075036067706146938606935828164715651991038562211948991793612680810706154360379174985368814247197834523678431906272632783751162416558227320531206425126822414143483
Q = 1101151243089463150164922381381267094050976448406463446991545709238685005093167898512049169132894513126331643995051194415325746284216129039849155533013776475855788071536283
R = 1156071504590184504287861153519983657345289488227234691230525545110938621307290985719632668840270798070288334468619832540778401959239377371013701943637904978392236354405923
3495700935892996495849575102560472246674767943168860068520173732981675243146346666459045803703531594886180838355802373674638075032131263557299198400609711599502974716708712723068425650500317253668183934887892215118994062994482257114660442472268384685376529188883135961482911917441363788308157016322909485207572548032195963679427678852316300519948903238741545516509080405518992849121619593677468802205375380772735673896323711357089114922999274806140879986390622161578509827266494047665614106323256669096351719947
Miller-Rabin pseudoprime for primes <=541 (100 bases) - 40 seconds
D, P1, K2, K3 = 163830761733856511988870240072545991183860227456702154728519670383547331324532868908995681607056416577049061619183840032668027646026325503554869855624445945171736628483536356155835702608605962227867004832088324490108635927029320, 61309724624610862695589712628872018557582207284360158693661111867310905398770637226362461989457090233054760243914315912657635473831084968145866149830353785538894834149435862099495304568054840446918205737017673126269089745383911027, 2081, 4177 # 100 bases
i = 47161
P = 7787732278755017824602699104690213508779614394369890477845377286825786597995065267843507802259844752423265555266243395693314487288078622041297083410934849005783165970061493954764862875292520625075354020623135144404282468700013671
547
Q = 3252935772835970945336547416029102182617244932528303252596014092707131061982538762378233209003937153087198022434709866381097461340230440426649791740747486429715628425694686024905283223009685865093975374414283549817668787175995710
6047643
R = 1620627087208919209299821683686033431177037755468374208439623013388446191042773082238233973650273692979281562050905250643778744804649161246793923057815542078103476838369796891986567964348373542078181171691674423550531181736472845
0487227
4105533452433021765013837810250129497906776520439478762444757535787150166441808983131547549061042819241803677734684089387936615218512623246819260378395895806190969367738434747226833314918439125195560533069527626034315805252829069712946717489170662443699387652432168043013276992556383661463839991504034566570743939526431419627777024666651653328024067508705964704654262029757671485757644661464119465787544601305942781717049259725682702584999377699680541279376069665052863573819455144839742780771486371611198963915144096863366918510828427548413169928095028815881158255689153934576571383186599819333534474537810962373427256838686635300737173281200715737713827696261842481543872169300021385829998511793741667
Miller-Rabin pseudoprime for primes <=659 (120 bases) - 4 minutes
D, P1, K2, K3 = 6793457464927132429839506140923221331166241933169983904080669440998323551865225177574525086971838229214342990755152217463168162824468888781497331344909044957196064039220542791586451534883392575403444258722768484053080198145074194991857958744163006288027394657809573867671273538719480, 1082010667437248961796874734910407026117763268437636443783741306377257133956559959850528382751452152066059013480363673785771001504893985670563477957863982411914255677126209398089467705585303017170266366542357800372289023063897165514359429127927131974451722841878737137362641844033906907, 2081, 4177 # 120 bases
i = 218281
P = 1483964699569196642879594114681772082414416218682714893010416347556932320358649776945995438892051272663202061378505744853863580750992787497784582461255955224713628310222225510488371695191467117768809482604806985267962687754368837522532106521762572307531359456143210330546515901149260720787
Q = 3088130539803498213832435352652767703504400151078729692354676419265976158666350185824616508334358698412123489728670455040890111542815990782889716101873642822629060513572451287326301497693443072076892533300603336342630353216841550884389313671787912971972759028234020697867299590291611559955667
R = 6198520550100534377308064617025761988245016545437700108104509083745306302138080118303422948252098165914195010378018496254588176796896873378246200940666124973628825451798235957309928570814758150920317208840278777464280146749998634331616608941402264528558488448310189550692796919100462030723123
28405815753529733559871806180650039227867183312173853665420427796878772014159921711572401606946254230318069136497853819954843219894290827397106454689820806592661994947114634189392275706284517175986740195541286806800371927994028155032848450096856722472297378042151775383466616008301763864020974316014741404820195618498752268634168176834951324092092652744315159786840924543524757372307179838259863039906757419421192850001323907093526425222439081893290512297526378692918427101494493840846656975716801804079879946067663917708606762045425485806071117778908983120127998676781134102581087012920764615219782665111270556617281369131204235756134060928359948359362510963939433119537493888316954320239178843079973668982874418895817461560956789617818976460192017033826230643346380855667183906186750875634903725232324406188659403727600027656714749497004539324774953128638940332666708267
Miller-Rabin pseudoprime for primes <=866 (150 bases) - 8 minutes
D, P1, K2, K3 = 2250542028162300204153375799483819036940380565881521892017369792873402147819921438100391052652614499581989722557044612743292071890316063115263506738931952267478191918712573601330274640160953118962248905196901713363571114121177238029573374004614554212113178449892699140204919389729228927462110471546569270024185299292143839352837409077230512452871086976514876279432547640, 956774561096681708150590904754727613528013059044072907853464565219312818165066398131272277645363153810356901606749683001363364192805948338274353580811556834009276084912662895062366451865686593067752928594372324809380605595209980033364952306384768611755478497944132336038185261066852303121708852713073740713123352192944359938216703699178305879978494286142267013692561550587, 4177, 2081 # 150 bases
i = 156155
P = 352390164968780670087720988873150489326953140324273123955825844571365425210984898564697837104614380336035962027502051185930136850225110784102247248398730563162066335151474593610791402886199320884617730719616559375097827931187641584541395169996970481604288859340938566574737372564234595470967569537067598101339778763157665594080542318154108977958063081103822772428482038274787
Q = 1471933719074596858956410570523149593918683267134488838763484552774593381106283921304742865585974266663622213388876067803630181623390287745195086756561497562327951081927709377512275689855654563335048261215838368509783627268570778898629407625077345701661114565467100392582678005200807905282231537956331357269296255893709569186474425262929713200930829489770667720433769473873781123
R = 733323933300032574452547377845026168289389485014812370952073582553011449864059573913136199014702525479290836979231768517920614785318455541716776523917758301940260043450218629304056909406180786760889497627522060059578579924801482137430643348763695572218525116288493157042028472306172193175083512206637671648888079606131102101281608564078700783130729271777055189423671121649829667
100.00% 380371432714438408643606610732822034847501900960333382032713208764416811879198939946321547624163503138106841926986062482811833773120155739166510497052364920558649187257533762310146733292309049350859872905914985367446132676885922076941014934134432725906044649741489417231517074464758740359189739317946413297918400822335298115187408307788994326109218134963447530614220806901707097182841114209042839897697147321148815046367620771589024116388606578702883143181008990896766466348901162595112838012768179898379272540531185894718935283059491243160599812939061700628648090146449800171778383527896386709921034379445027411802470097269217661302163364757977112018260870700413942713090760785694478453023051874115350553661810946528211503096476241522166725773089294494883007561732858752410233072288635504861044426459380806154142259565635096615291047530321001179237368195551945161510774296817381738478834668793627762884824744107001790130705206456321611527072785458058386656171841783283079254920152265902008156065481037182307117628871546722067989964550142796898091922281173993887885943414538122625393225365356834513640834479825410961094544504378267
Miller-Rabin pseudoprime for first 200 primes - 5 hours
D, P1, K2, K3 = 17200311933401204143114537735913751876646554205919606149595894402613516093901955630877083502012810711630700617549546709505138428819063464806620389981456203011644717861346549334927838631340154226824349424067786775315461094886367547888512209208816859615624839019714617394350161237146288007853780813596876087476182430055957149362518154453871016830965562455764486002268816023849962353925664803384185465483369126203382492389680061124207973131227039933132444825547494444218065763833503053265789406320606264143000203183356477080, 3331583297144207488262873516467830218985924616249217752512332623807581641849198865452945479223342669598328157704628378889592701637660018419441789256199596918978343273829623753932911481150958653002082197377658858445718117918991010252179548699572749436131982279009984926584844357812628549617140704643572092133934765203825493164238917485845484333219048612276143088419961476168329622462425219577001093844620861537699989936384963205899870388734638750839482885861172039092730742745792187956606873550446330832935350111560233187707, 4177, 2081 # 200 bases
i = 2562536
P = 44079750123867332267568417945153949909193340353236653081913377191519436658844990973390690994393123252408887365850649855167349001533925274870117229450777052237566987072817370770282576806481024410442563157950347710928226130363651741706288702085824292921420944464502426784175069620349712915043213211655928033789000554351076035191994060359090665470288387601757179045398342699968555460201719807824474087071735408046248658508217570076189302506190748640840322116365035395147878100933595372291459528988731540022780104014777133583862587
Q = 184121116267393846881633281756908048770700582655469499923152176528976686923995527295852916283580075825311922527158164445034016779407205873132479667415895747196317305003158157707470323320671238962418586310758602388547200546528973325107167908612488071532775285028226636677499265804200750846135501585086811397136655315524444598996959190119921709669394595012539736872628877457768656157262583637282828261698638799409180646588824790208242716568358757072790025480056752845532686827599627870061426452585931642675152494469724086979794021723
R = 91729960007767918448809877743865369761031341275085475063461737935551947687056426215626027959332089488262894608335202348603253272192098497004713954487067045706376900098532948572958042334287011798130973931694673586441638577286759274490786789040600353569476985430629550137868319879947752576204926693455986238314910153604589229234539639607267674843670134599256689593473951158634563912679778920082730575196281384144243458355600763328549938515382947921588710324155638657302734328042811969738527279825550334787405396454751214988018041467
100.00% 744481529345852753070123825977979466391706411383282995989834377263226589509482057414516645244922434228291378091261713247708000760971590514908865791546302764026055786350635816199760049472584371652543545731522858891404996717429638664505291381403214441125344194255994669756364228134322881768401410524121530304586827029116472204840821307988211802770113119063366611673220306501994985268136122118545077859717968752294888992215185683016537446569803174222462849135915008616747228184552730575404412408417008246140581992827510403343324797456075340997006389461922850054998637750041168004315124788720033445267176833496978582963493652607159974552197354653086741039856830900242942857177890114755368611080098296666340250598911588377510415828810912354397069914013861602516954912695571038390062764657684291189204888777246978774855758349374609686397956828632214369637758230561952903718758717316643193035669106298374378347646197261052891308274328517871607707638424303157101004891484739845157761551845192431539939827159174576679556485246335300927319856143357850128179286574406774927765638965481814188369190709131489487813439039278482942716429305990821603156296550488831966444205232591740196708645476726264601439914115536178636543793793680872519390376730226688655878855435160215558128557731509649512614575899161651112634690598315371549963925026952211709531180782628631420997105213722525239040500852051584219749796892003745873378515637875031051931601686570219778349426589557641046965734942945686229507069963658824980697467098920533895698789779865772111805316222261553194460255301379229349303398247260055887267
Miller-Rabin pseudoprime for first 311 primes - 20 hours
D, P1, K2, K3 = 2903334900920497107157352051974397758929400628889766141990740045074490277418686136756612233375271134548426263070675012672050852065661266469320575873093629860918659642735689916918213855776107557517623546129896173392900954907298528534486136345926008904479988351298416466444574506310203520543810516889496678344774453049703492832774732318349336806719093250972459541669761082617109836792695107444826710483326867584431844456518914998221490508926698337052463377746826794610398911328334911575191205944042042944311030847233562450835379595296712591515461818208763673189382400758589698538910159783832001609038684105311510103523080614791383380923554533545527869571703319047599699683813075682037884640233818061303040619519572100995757622806819872963455715180487038621170671206187939910398315384957764845168158377873614142153179829843635142167502074968220842814445937691812640822079174064680, 2440030577176129390870911122445066662739070661186677846069755743422925521230771432335781266006749611007898543561431693511661810242577227001339103313006317133313123616524971080005359434456618563376771190698072566345860280765963726249341573984019152015915228912857350337086414892763592380415227485461726252003444758223376187598893805049737629404219942695086813312453805752943401080076836101378633250966494333329218841416292480791679406497315047522024894045784981729096048842103569744041381740066655167217132096551294406696963125060039850495050864779438887606959797045887915782791531635685480457007402997446516784813498031091972767895204475337787880543317496002389255568044506365125979979319189176172961959341058588169903636731399948632216346851872530283233915933333202934556512258628822274671049442493496380618093327214845331139554316172248480628640184434757171846633546235080242907, 4177, 2081 # 311 bases
i = 3017691
P = 8763807631070851965185647782197117414204160983856173956636248073104306565275103158147533708412462074897582896775569781358845469631119990100071817030364795305758804059563231812154847048085314409916291687734970585948542535795926567598011344849857822888985035756730927035378680901414507964493787330008243847022924208756236159177627708549541666167009167174315419220073416796916852201580861727581665194036107632701060935971253313600689687321870832278960210156901984478383745349967417877390291707196548831781878031084970390712520830611370571767497936354431661145317500363373477221756373870623917257224588958673888113020624166694622397274057786679227325422799020456562459440906590070533130566117191019835404595909499695641195892453256935017895179987450591642346993059896205693510706315010977404628051394465977300914866464721115514506942145820285173804002208360593900951741654471097498496787
Q = 36606424474982948658580450786237359439130780429567238616869608201356688523154105891582248300038854086847203759831554976735897526649188198647999979735833749992154524556795619279370796119852358290220350379668972137507062172019585272856893387437856126207290494355865082226776750125208399767690549677444434549014754419974798436884950938611435539579597291287115506082246661960721691646003259436108615515488821581792331529551925090910080823943454466429216797825379589166208904326813904473859248460959984470352904535841921322006199509463694878272838880152461048603991199017811014355276373657596102383427108080380830648087147144283437753413739374959132538291031508447061393084666826724616886374671506889852484997113980228693275242777254217569748166807581121290083390011186451181794220277800852619131370674684387185921397223140099504095497343091331170979317224322200724275424890725774251221075123
R = 18237483680258442939551333034752201338958859007404698003760032240130061962337489672105017647206333577861870008189960715007757422302360699398249451240189139031284071247951085401094236707065539287035803002176473789358917016991323187171461608632554129431977859409757059160623034955843591074111571433747155445654705278421727447248643261491596207293546076889750387396972780354383969431489773255097445268789139983650907807756178145603035239316813201972516197336513029699516574073282196602849197042676018118938088182687823383072755848502262159848163205553572286843405718256180206098475014024768371812284369623000361163195918890891509208727314254079472064204844761570106478096526613936779444708089874512277476964087668866629328652195227681772239869553884681207724092557644004048195779841537843979030974951883698763203837113084641385688946605452013446686128595598395907880574382954353894371811667
100.00% 5850797453080941400653678824264622701126524955411214056119329867806939007774506007776020892533112875262786114786818512784084894270341021346067839029684598352493757700480909031058713961427870493806070115219708941881975805977746331123655396670012658345726824203396520965362090617451842636983102278850593102400129299381167748741794854555794514740327886342115005135512604623503289202325446050602904259518509271546353824416648964531601179233310434413817634522664204084419834763787442217412813710975439548484704664549494746504206126854629724284659034715361923390817968183114430697159028974527438444420675325469233939340448084417309702534207156216408677453907378575052873120200775640747033664983954989380102582960746779972979546468831629180687142863864915675787515698868531430994470780056007358195229392891834291612840944727131790019972587545176058445393871575221253968160307175662272614939428362964798621201908283600227425067622379841784688742002584396668156394465338611382204502926795517894551552862682940781378918014690462018200676234123867105312199529332642695221366479748757370850474165127779888249613861127691466337705299784157335744307987884889172520519227364049556648332779512809738628028754434197875651430400246044884191277481420229124018936086995009944507237484021307867499995359192315418939671378779943473952080377910425589518866559903062424628610419058385237198379955799887868909238179334779546212262288990122417901059739727025374445404880032389298297364912078870435550673982187548617076769873510713253094879547615429581904625251313588070459739361551464578963838617502458034406296007231002239291787390430518041015857206316459462850065841493807354947887091621281258440899461347100471740977026010421811808405684898096368031471104139674349278302356999359976247433991946043382686160912010851608731573358718893580503251714197859234976681608525262847859036167651214842583188142189281697404133004077081426702693833807279071493671341061457996558139730172146855597742706647807271614058600278779438211425049750996739852243057676480549096856773906260057270449309344307876079199610172051216728121842610144979350416256460160868642605154238600442743452079758553483264274048368946358584935742236380670011145119387200446012936902389941965007780859522383612905796927804013220039743831866023380247339233003823453140744229188817190747381955623282109166465240796608132487834224897287431731165007624971453449479587807396656891822914207566223017200475409928628051687644290705807435216047147720670387448289473744472515735093081378209419382027393859570071946257266470329591797790227339326682673129777464514371244246630744093080419461740868223853308912398762985909902693188267