Math 如何对大数执行数学运算

Math 如何对大数执行数学运算,math,cryptography,biginteger,plc,iec61131-3,Math,Cryptography,Biginteger,Plc,Iec61131 3,我有一个关于处理非常大的数字的问题。我试图运行RSA算法,让我们假设我有512位数字d和1024位数字n。解密的单词=加密的单词^d mod n,不是吗?但是那些d和n是非常大的数字!非标准变量类型可以处理我的512位数字。到处都写着,rsa最终需要512位素数,但实际上我怎么能对这样一个数执行任何数学运算呢 再想想。我不能使用额外的库。我用java生成素数,使用BigInteger,但在我的系统中,我只有基本的变量类型,STRING256是最大的。假设您的最大整数大小是64位。在大多数语言中,

我有一个关于处理非常大的数字的问题。我试图运行RSA算法,让我们假设我有512位数字d和1024位数字n。解密的单词=加密的单词^d mod n,不是吗?但是那些d和n是非常大的数字!非标准变量类型可以处理我的512位数字。到处都写着,rsa最终需要512位素数,但实际上我怎么能对这样一个数执行任何数学运算呢


再想想。我不能使用额外的库。我用java生成素数,使用BigInteger,但在我的系统中,我只有基本的变量类型,STRING256是最大的。

假设您的最大整数大小是64位。在大多数语言中,字符串对于进行数学运算并不是那么有用,所以忽略字符串类型。现在选择该大小的一半的整数,即32位。这些数组可以解释为基数232中的数字。有了这些,你可以做很长很长的时间,就像你习惯了用10进制和纸笔一样。在每个基本步骤中,组合两个32位量,以生成32位结果和一些可能的进位。如果在64位算术中执行基本运算,则这两个变量都将作为单个64位变量的一部分,然后必须将其拆分为32位结果数字(通过位掩码或简单截断转换)和剩余进位(通过位移位)


分裂更难。但是如果除数是已知的,那么你可以用乘法来代替。考虑一个例子:除以7。7的倒数是1/7=0.142857…。所以你可以乘以它得到相同的结果。显然,我们不想在这里做任何浮点运算。但也可以简单地乘以14286,然后省略结果的最后六位数字。如果您的股息足够小,这将是正确的结果。有多小?好的,你计算x/7为x*14286/100000,因此误差为x*(14286/100000-1/7)=x/350000,所以你是安全的,只要x你可以编写一些宏,你可以在微软下执行,比如+,-,x,/,模,x幂,y,这些函数通常适用于任何小于十位数或十万位数的整数(实际的——而不是理论的——限制是CPU的内存)。请注意,逻辑与小学时的逻辑完全相同

例如:p=1819181918953471(2^8091)-1的除法器,q=(2^8091)-1)/p,mod(2^8043;q) = 23322504995859448929764248735216052746508873363163717902048355336760940697615990871589728765508813434665732804031928045448582775940475126837880519641309018668592622533434745187004918392715442874493425444385093718605461240482371261514886704075186619878194235490396202667733422641436251739877125473437191453772352527250063213916768204844936898278633350886662141141963562157184401647467451404036455043333801666890925659608198009284637923691723589801130623143981948238440635691182121543342187092677259674911744400973454032209502359935457437167937310250876002326101738107930637025183950650821770087660200075266862075383130669519130999029920527656234911392421991471757068187747362854148720728923205534341236146499449910896530359729077300366804846439225483086901484209333236595803263313219725469715699546041162923522784170350104589716544529751439438021914727772620391262534105599688603950923321008883179433474898034318285889129115556541479670761040388075352934137326883287245821888999474421001155721566547813970496809555996313854631137490774297564881901877687628176106771918206945434350873509679638109887831932279470631097604018939855788990542627072626049281784152807097659485238838560958316888238137237548590528450890328780080286844038796325101488977988549639523988002825055286469740227842388538751870971691617543141658142313059934326924867846151749777575279310394296562191530602817014549464614253886843832645946866466362950484629554258855714401785472987727841040805816224413657036499959117701249028435191327757276644272944743479296268749828927565559951441945143269656866355210310482235520220580213533425016298993903615753714343456014577479225435915031225863551911605117029393085632947373872635330181718820669836830147312948966028682960518225213960218867207825417830016281036121959384707391718333892849665248512802926601676251199711698978725399048954325887410317060400620412797240129787158839164969382498537742579233544463501470239575760940937130926062252501116458281610468726777710383038372260777522143500312913040987942762244940009811450966646527814576364565964518092955053720983465333258335601691477534154940549197873199633313223848155047098569827560014018412679602636286195283270106917742919383395056306107175539370483171915774381614222806960872813575048014729965930074085329593091976084115633821869206793759222059955455105714004662351520571711256963959135113704043570353570393189955664233788052528

最后一步耗时约0.1秒


wpjo(willibrord oomen on Academy.edu)

你应该添加语言标签。我不能。这是一种称为“自由职业者”的工业api,专为工业网络设计。它有自己的名为FBD的语言。如果它不在库中,也许你必须实现它。我发现,请看你提到的以下关键词。你指的是那种语言吗?如果是,你知道有什么免费的吗(但可能不完整)参考文件,而不是340CHF标准?您能告诉我们允许哪些数据类型和基本运算吗?您有64位无符号整数和这些整数的固定大小数组吗?您有位移位运算吗?对于您的计算,n将是固定的,这样您就可以用Java从中计算内容了吗?此IEC 61131-3非常有用类似,但我没有64位整数和任何类型的数组。但是我有位移位运算。N将是常数,这样可以简化问题一点。^^^。哇!那堂课的Thx!它将帮我一把!幸运的是,我不必为securyty费心。这只是为了学习