Skip to content

Instantly share code, notes, and snippets.

@wsams
Last active November 30, 2021 05:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wsams/12723fc953e7f745deafba7f45b6a7b1 to your computer and use it in GitHub Desktop.
Save wsams/12723fc953e7f745deafba7f45b6a7b1 to your computer and use it in GitHub Desktop.
Multiply two large integers (1000s of digits - or more given enough time) with Python, and Node.JS
/**
* Usage: node multiply.js <positive integer a> <positive integer b>
*/
function mult(aArr, bArr) {
const as = aArr.reverse().join('');
const bs = bArr.reverse().join('');
let rowa = [];
let remainder = 0;
let rows = [];
for (let bx = 0; bx < bs.length; bx++) {
const bval = bs[bx];
rowa = bx > 0 ? Array(bx).fill(0) : [];
for (let ax = 0; ax < as.length; ax++) {
const aval = as[ax];
const c = bval * aval;
const cs = c.toString();
const cl = cs.length;
if (cl === 2) {
const save = parseInt(cs[1]);
rowa.unshift(save + remainder);
remainder = parseInt(cs[0]);
} else if (cl === 1) {
const save = parseInt(cs[0]);
rowa.unshift(save + remainder);
remainder = 0;
}
if (ax === (as.length - 1)) {
if (remainder > 0) {
rowa.unshift(remainder);
remainder = 0;
}
}
}
rows.push(rowa);
}
const sortedRows = rows.sort(function(a, b) {
return b.length - a.length;
});
const maxCol = sortedRows[0].length;
remainder = 0;
const sum = [];
for (let col = (maxCol - 1); col >= 0; col--) {
let tmp = 0;
for (let row = 0; row < sortedRows.length; row++) {
const rowForVal = sortedRows[row];
const rowLen = rowForVal.length;
for (let t = rowLen; t < maxCol; t++) {
rowForVal.unshift(0);
}
tmp += rowForVal[col];
}
tmp += remainder;
const tmps = tmp.toString().split('');
const tmpsl = tmps.length;
sum.unshift(tmps.pop());
if (tmpsl > 1) {
remainder = parseInt(tmps.join(''));
} else {
remainder = 0;
}
}
if (remainder > 0) {
sum.unshift(remainder.toString());
}
return sum.map(n => parseInt(n));
}
const a = process.argv[2];
const b = process.argv[3];
console.log(mult(a.split(''), b.split('')).map(n => n.toString()).join(''));
"""
Usage: python multiply.py <integer a> <integer b>
"""
import sys
a = sys.argv[1]
b = sys.argv[2]
def mult(a, b):
a_arr = list(str(a))
b_arr = list(str(b))
a_f = a_arr.pop(0) if a_arr[0] == "-" else None
b_f = b_arr.pop(0) if b_arr[0] == "-" else None
f = "-" if (a_f == "-") ^ (b_f == "-") else ""
a_s = "".join(a_arr[::-1])
b_s = "".join(b_arr[::-1])
rowa = []
remainder = 0
rows = []
for bx in range(len(b_arr)):
bval = int(b_s[bx])
rowa = [0] * bx if bx > 0 else []
for ax in range(len(a_arr)):
aval = int(a_s[ax])
c = bval * aval
cs = str(c)
cl = len(cs)
if cl == 2:
save = int(cs[1])
rowa.insert(0, save+remainder)
remainder = int(cs[0])
elif cl == 1:
save = int(cs[0])
rowa.insert(0, save+remainder)
remainder = 0
if ax == (len(a_arr)-1):
if remainder > 0:
rowa.insert(0, remainder)
remainder = 0
rows.append(rowa)
sorted_rows = sorted(rows, key=lambda i: len(i), reverse=True)
max_col = len(sorted_rows[0])
remainder = 0
sum = []
for col in range(max_col-1, -1, -1):
tmp = 0
for row in range(len(sorted_rows)):
row_for_val = sorted_rows[row]
row_len = len(row_for_val)
for t in range(row_len, max_col):
row_for_val.insert(0, 0)
tmp += row_for_val[col]
tmp += remainder
tmps = list(str(tmp))
tmpsl = len(tmps)
sum.insert(0, tmps.pop())
remainder = int("".join(tmps)) if tmpsl > 1 else 0
if remainder > 0:
sum.insert(0, str(remainder))
return f+"".join(sum)
print(mult(a, b))
@wsams
Copy link
Author

wsams commented Nov 30, 2021

This Python function is a port of my original JavaScript implementation. Here's an example of performance multiplying two 2428 digit integers. Node.JS is the clear winner.

$ time python3 multiply.py 3265748097182190042007452355317036532928963493133987903810977244161784836203191785025462999496618803881325623953126191522343375180390115721997671032305480784819412862133452530243297507911378612396353525208330974600262435473657069502111300961231954132544767423140529416183190003176099668492440359218042806577668356641972331140162982193859740246284825794380470092602296970812446055386958636127172267606836369616161668276348382409693562876707933630443786464741640257634519028696701881904063215661338351436069930288904694354985471930570166449014247420904988248298798155236016874854915155824400312763551642932070105174619505909966984601934839597376595632481266740988521333734054880957691000011100996650856434999069576568222592536497339664340394699276298775374919616474867414322043889689315959496097047686026166346675473629721299251353265948211270147827526620896539605550659709767844852998158308556061723802058707295863231578423901330318959411918541480346845992670263703325432280695838552283076210725551200466499459846947305462519874745499965656730973056082373525918716480936054136404650984286447904090531937254735506333909260854205194405046501919195761213848606394403929481856222334055386692343694934645022992587394132138245321249669397547542133632238379891340778268569833323582775055742826217603344630736662218989797106960396505613699950266506655013249973893670624239080895736518560779668690853126438027724671373511404069024560545955794821955759140832720523581629308809320327874627746345682259375410910564382719683524744301273488678178555211400276779152841864618432473930484517068270245172387360241999476439525328562621826456216144768793448950036645437348344096261211498541654257646536232786801326637739451853491904605198407571733850360013247028022691708005698160710438831681740292610711263393233008142336722200501923928333956005317767434813336051652772687860634580494273841119576311844931805909299459060064719571763360184078896378245859529643702243017953194565839999121295679391701576547746753335359264968301364056482113811973904398541701077311541717732567914287925343086006630073927262188903213675446240531197429106721399097316263875304717556060399708436931477135918206995151565570958914702244695812949442848827108672344577645321963271499849030484670380546337085608392798417616221896182254650553783031090706986064779945934843752402749983360480833626829084625792506499360701858088656818744112408925417412319802679121494293212890625 3265748097182190042007452355317036532928963493133987903810977244161784836203191785025462999496618803881325623953126191522343375180390115721997671032305480784819412862133452530243297507911378612396353525208330974600262435473657069502111300961231954132544767423140529416183190003176099668492440359218042806577668356641972331140162982193859740246284825794380470092602296970812446055386958636127172267606836369616161668276348382409693562876707933630443786464741640257634519028696701881904063215661338351436069930288904694354985471930570166449014247420904988248298798155236016874854915155824400312763551642932070105174619505909966984601934839597376595632481266740988521333734054880957691000011100996650856434999069576568222592536497339664340394699276298775374919616474867414322043889689315959496097047686026166346675473629721299251353265948211270147827526620896539605550659709767844852998158308556061723802058707295863231578423901330318959411918541480346845992670263703325432280695838552283076210725551200466499459846947305462519874745499965656730973056082373525918716480936054136404650984286447904090531937254735506333909260854205194405046501919195761213848606394403929481856222334055386692343694934645022992587394132138245321249669397547542133632238379891340778268569833323582775055742826217603344630736662218989797106960396505613699950266506655013249973893670624239080895736518560779668690853126438027724671373511404069024560545955794821955759140832720523581629308809320327874627746345682259375410910564382719683524744301273488678178555211400276779152841864618432473930484517068270245172387360241999476439525328562621826456216144768793448950036645437348344096261211498541654257646536232786801326637739451853491904605198407571733850360013247028022691708005698160710438831681740292610711263393233008142336722200501923928333956005317767434813336051652772687860634580494273841119576311844931805909299459060064719571763360184078896378245859529643702243017953194565839999121295679391701576547746753335359264968301364056482113811973904398541701077311541717732567914287925343086006630073927262188903213675446240531197429106721399097316263875304717556060399708436931477135918206995151565570958914702244695812949442848827108672344577645321963271499849030484670380546337085608392798417616221896182254650553783031090706986064779945934843752402749983360480833626829084625792506499360701858088656818744112408925417412319802679121494293212890625

10665110634249094974989568389796237032040955883869082972127755715986301020406214577676418043407562504073214155749824775739832809609317099609751857135834929930035367565904175611521251521320622912074001164898551558299878070782653102025574743505335405683579095621606543201515051480178753311864079565414043599219428599611302249736946596930577936388204500497964230634930221266340452638823943851857975319588032204603752180564184042956207497880389236039190272762135477465204221257714525010171236667871803020621498522575862405166324536215099498901952507287608789904080222044572207390462759508120773131570194410059323045144382919975744267725545906263191428382644202985729515129473593101979191380013911016626238899030532969440888615186613065883413687192599642648558175793811157469795664177068465154710364822582949216759142558082029007147089563009199040633666069470742972978673980782888254631608931144826315085405987799993644373290977368034975825584781161230702009459338131787542413328672174449788832044858542754975962131645187058019423370806817922769777812623073890685597550763256330839190042658857605454759849661853470830625616449305554080760894440554463124151456839290792187993925756928568471419281136940243654834510314030291451423048451888430893457970499106631712463965216238046467704118986010771865443254195696312427454637946633969350991850409527076083223956213962256664696361719245355327452200117252369699820602659129095705547760497074284445002671652960463642375493941710424102539502370321381656172923670560262715751970608444022339827734711576078165086042930227314688516434455920553488701755063486829900560866432638723006069603035633784141534791312124126265483689685688221757847498420153141674540011774917477011681585260891207585344137732281905057351287713856239552821103696484176639941208748877449596054212176212687832241142712790912051839029073074405572436320796853270563662199492185169584418039407868009043238427155269945109759842029657709554894924068927936753720728367664334921196382195770366582107119873573274474437435876553835318150415399116819542350942220224132693175152234653125925120436343375421194756919052346873519064788628839188353139451641873684820546515211940751799846274482298583856355322877063369689736355841412821009446620816149602817366538895557789199790766556916804641458736149302471417593585189761897977512697304458399930944533432233064724084816780735838299910226215033391157262470143266404719438329667377944412617891745786449679279099708886881781413086704895675228034171827208782870065604169076204290829342553332806968124640256437241097533937526198112480834926320023333775073180099740712274615575187261225310026978329135872513637447014603422002631606769909687857413846122978468544796945187406699533733401993281104449478860737189822882942122007334648261419523232575846082659126346563376984516364753097382936411543684766507631360742254953936385024036656129737387764221053888712469669498417132311069603015327135797769778130618115556334793854960226343976210123215903379823782285902789241405685814111225380223431506990106068409030707832655148630664260558924201124197797741024121404557495431470247787663016430656999373988811863443244951410978799720902588127756608218497256682566094053282616507960392346777603172219889725086941786136973449885761520952013727533519942476996087944997901841293718738931602800261809763560196674645607575808749968885029604753510896528308808902598744504196518187617901308998177337735109738544445962803450822854054578625083588708574422141307054895260107008097026757715408060335562607598809412565174143659933336184014846493896289745583654637350013819410448094158201049454450872914060849959985285313292786289490960159929369070161312912443742962976341363242052180623542841264214102058240622617788646424954067961491725419343646010720599057297380438142370950156835522965469414543915985592966978422388213829852842560817124061981902810313152686804538151245918422845574888634618103619623849875115166037668787365402705367154341096251092734363360653476682959160128715120005381964616777727280903322020090336728552819053619513268956605374327728040791024209565754892611637724792272887434202083614386826325697566637485053165704601560108726544249900173118202247116270665342828931840621601866454683603650958097958593031767304429403715964786328712897552699168499297924290941910550270672046068834423634313900791073366145944778187576123979874184907103468913098804032877817361088169239285842323429130158934941330740621140141500804197584952814494235897526576141179841418348205171509894680105824525897612100982641112177224809648054594557960076034682494151189970856402354434272321857199639289497239189746643122559188451933571806855752977332426802251887962225194470130917352100058606616774716500824297524288393733595948709605389196801311658072459707348298050800838331460701240721927175962824379699817587720256373273741701268590986728668212890625

real	0m18.390s
user	0m18.122s
sys	0m0.187s

versus

$ time node multiply.js 3265748097182190042007452355317036532928963493133987903810977244161784836203191785025462999496618803881325623953126191522343375180390115721997671032305480784819412862133452530243297507911378612396353525208330974600262435473657069502111300961231954132544767423140529416183190003176099668492440359218042806577668356641972331140162982193859740246284825794380470092602296970812446055386958636127172267606836369616161668276348382409693562876707933630443786464741640257634519028696701881904063215661338351436069930288904694354985471930570166449014247420904988248298798155236016874854915155824400312763551642932070105174619505909966984601934839597376595632481266740988521333734054880957691000011100996650856434999069576568222592536497339664340394699276298775374919616474867414322043889689315959496097047686026166346675473629721299251353265948211270147827526620896539605550659709767844852998158308556061723802058707295863231578423901330318959411918541480346845992670263703325432280695838552283076210725551200466499459846947305462519874745499965656730973056082373525918716480936054136404650984286447904090531937254735506333909260854205194405046501919195761213848606394403929481856222334055386692343694934645022992587394132138245321249669397547542133632238379891340778268569833323582775055742826217603344630736662218989797106960396505613699950266506655013249973893670624239080895736518560779668690853126438027724671373511404069024560545955794821955759140832720523581629308809320327874627746345682259375410910564382719683524744301273488678178555211400276779152841864618432473930484517068270245172387360241999476439525328562621826456216144768793448950036645437348344096261211498541654257646536232786801326637739451853491904605198407571733850360013247028022691708005698160710438831681740292610711263393233008142336722200501923928333956005317767434813336051652772687860634580494273841119576311844931805909299459060064719571763360184078896378245859529643702243017953194565839999121295679391701576547746753335359264968301364056482113811973904398541701077311541717732567914287925343086006630073927262188903213675446240531197429106721399097316263875304717556060399708436931477135918206995151565570958914702244695812949442848827108672344577645321963271499849030484670380546337085608392798417616221896182254650553783031090706986064779945934843752402749983360480833626829084625792506499360701858088656818744112408925417412319802679121494293212890625 3265748097182190042007452355317036532928963493133987903810977244161784836203191785025462999496618803881325623953126191522343375180390115721997671032305480784819412862133452530243297507911378612396353525208330974600262435473657069502111300961231954132544767423140529416183190003176099668492440359218042806577668356641972331140162982193859740246284825794380470092602296970812446055386958636127172267606836369616161668276348382409693562876707933630443786464741640257634519028696701881904063215661338351436069930288904694354985471930570166449014247420904988248298798155236016874854915155824400312763551642932070105174619505909966984601934839597376595632481266740988521333734054880957691000011100996650856434999069576568222592536497339664340394699276298775374919616474867414322043889689315959496097047686026166346675473629721299251353265948211270147827526620896539605550659709767844852998158308556061723802058707295863231578423901330318959411918541480346845992670263703325432280695838552283076210725551200466499459846947305462519874745499965656730973056082373525918716480936054136404650984286447904090531937254735506333909260854205194405046501919195761213848606394403929481856222334055386692343694934645022992587394132138245321249669397547542133632238379891340778268569833323582775055742826217603344630736662218989797106960396505613699950266506655013249973893670624239080895736518560779668690853126438027724671373511404069024560545955794821955759140832720523581629308809320327874627746345682259375410910564382719683524744301273488678178555211400276779152841864618432473930484517068270245172387360241999476439525328562621826456216144768793448950036645437348344096261211498541654257646536232786801326637739451853491904605198407571733850360013247028022691708005698160710438831681740292610711263393233008142336722200501923928333956005317767434813336051652772687860634580494273841119576311844931805909299459060064719571763360184078896378245859529643702243017953194565839999121295679391701576547746753335359264968301364056482113811973904398541701077311541717732567914287925343086006630073927262188903213675446240531197429106721399097316263875304717556060399708436931477135918206995151565570958914702244695812949442848827108672344577645321963271499849030484670380546337085608392798417616221896182254650553783031090706986064779945934843752402749983360480833626829084625792506499360701858088656818744112408925417412319802679121494293212890625

10665110634249094974989568389796237032040955883869082972127755715986301020406214577676418043407562504073214155749824775739832809609317099609751857135834929930035367565904175611521251521320622912074001164898551558299878070782653102025574743505335405683579095621606543201515051480178753311864079565414043599219428599611302249736946596930577936388204500497964230634930221266340452638823943851857975319588032204603752180564184042956207497880389236039190272762135477465204221257714525010171236667871803020621498522575862405166324536215099498901952507287608789904080222044572207390462759508120773131570194410059323045144382919975744267725545906263191428382644202985729515129473593101979191380013911016626238899030532969440888615186613065883413687192599642648558175793811157469795664177068465154710364822582949216759142558082029007147089563009199040633666069470742972978673980782888254631608931144826315085405987799993644373290977368034975825584781161230702009459338131787542413328672174449788832044858542754975962131645187058019423370806817922769777812623073890685597550763256330839190042658857605454759849661853470830625616449305554080760894440554463124151456839290792187993925756928568471419281136940243654834510314030291451423048451888430893457970499106631712463965216238046467704118986010771865443254195696312427454637946633969350991850409527076083223956213962256664696361719245355327452200117252369699820602659129095705547760497074284445002671652960463642375493941710424102539502370321381656172923670560262715751970608444022339827734711576078165086042930227314688516434455920553488701755063486829900560866432638723006069603035633784141534791312124126265483689685688221757847498420153141674540011774917477011681585260891207585344137732281905057351287713856239552821103696484176639941208748877449596054212176212687832241142712790912051839029073074405572436320796853270563662199492185169584418039407868009043238427155269945109759842029657709554894924068927936753720728367664334921196382195770366582107119873573274474437435876553835318150415399116819542350942220224132693175152234653125925120436343375421194756919052346873519064788628839188353139451641873684820546515211940751799846274482298583856355322877063369689736355841412821009446620816149602817366538895557789199790766556916804641458736149302471417593585189761897977512697304458399930944533432233064724084816780735838299910226215033391157262470143266404719438329667377944412617891745786449679279099708886881781413086704895675228034171827208782870065604169076204290829342553332806968124640256437241097533937526198112480834926320023333775073180099740712274615575187261225310026978329135872513637447014603422002631606769909687857413846122978468544796945187406699533733401993281104449478860737189822882942122007334648261419523232575846082659126346563376984516364753097382936411543684766507631360742254953936385024036656129737387764221053888712469669498417132311069603015327135797769778130618115556334793854960226343976210123215903379823782285902789241405685814111225380223431506990106068409030707832655148630664260558924201124197797741024121404557495431470247787663016430656999373988811863443244951410978799720902588127756608218497256682566094053282616507960392346777603172219889725086941786136973449885761520952013727533519942476996087944997901841293718738931602800261809763560196674645607575808749968885029604753510896528308808902598744504196518187617901308998177337735109738544445962803450822854054578625083588708574422141307054895260107008097026757715408060335562607598809412565174143659933336184014846493896289745583654637350013819410448094158201049454450872914060849959985285313292786289490960159929369070161312912443742962976341363242052180623542841264214102058240622617788646424954067961491725419343646010720599057297380438142370950156835522965469414543915985592966978422388213829852842560817124061981902810313152686804538151245918422845574888634618103619623849875115166037668787365402705367154341096251092734363360653476682959160128715120005381964616777727280903322020090336728552819053619513268956605374327728040791024209565754892611637724792272887434202083614386826325697566637485053165704601560108726544249900173118202247116270665342828931840621601866454683603650958097958593031767304429403715964786328712897552699168499297924290941910550270672046068834423634313900791073366145944778187576123979874184907103468913098804032877817361088169239285842323429130158934941330740621140141500804197584952814494235897526576141179841418348205171509894680105824525897612100982641112177224809648054594557960076034682494151189970856402354434272321857199639289497239189746643122559188451933571806855752977332426802251887962225194470130917352100058606616774716500824297524288393733595948709605389196801311658072459707348298050800838331460701240721927175962824379699817587720256373273741701268590986728668212890625

real	0m3.316s
user	0m3.255s
sys	0m0.134s

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment