明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2039|回复: 15

[函数] 纯lsp实现lsp的超大整数四则运算

  [复制链接]
发表于 2021-6-28 00:03 | 显示全部楼层 |阅读模式
本帖最后由 tryhi 于 2021-8-15 22:06 编辑

没想到上一贴那么快被人破解,纯lsp实现RAS非对称加密,其实我自己试了一下,32位确实太弱了,可以被秒破,那么高位数的运算势必要突破lsp的计算限制,本以为超大数运算以为很简单,结果发现想要速度快是真的难,搞了一整晚400行代码构造了13个函数才完成了基础的运算功能。
欢迎找BUG,找到加币。

先来个小实验,(* 2 2000000000),一句2乘以20亿的代码,正常来说应该得到40亿,但是CAD却返回了-294967296的结果,意味着整数计算超限了,不过还好可以使用浮点数来计算,但是浮点数也是有限制的,到了17位数之后,计算结果已经不可靠了,误差非常大了,如果要做1024的RAS加密,至少需要计算到309位的整数,显然不太可能,所以尝试了一下突破极限。
那么需要重新定义什么超大整数,结构是怎样的,我定义了一组无限长度的列表,用10000进制,比如(1234 5678 7890)就代表整数的123456787890,比如(1 2 3 4)就代表整数的1000200030004,负数则第一个值为负,第一个不允许为0,除非本身就是0,用(0)表示。


该系列函数可以计算任意大小的整数,比如两个100位长的数相乘,理论上无上限。
超大整数数据类型,类型为10000进制的表,前面为高位,后面为低位。
最高位不允许为0(除非本身为0)。
第一位如果为负数,则代表这是一个超大负数。
之所以选用10000是因为10000的平方还在lsp的整数范围内,而十万的平方超出lsp的整数范围。

try-bignum* 超大整数相乘
try-bignum-isfu 判断一个超大整数是否为负数(0定义为正数)
try-bignum*-1 求一个超大整数的相反数
try-bignum- 超大整数相减
try-bignum+ 超大整数相加
try-bignum> 超大整数a是否大于btry-bignum< 超大整数a是否小于b
try-bignum/ 超大整数相除

try-bignum% 超大整数求模(余数)
try-bignum/_sy 超大整数相除(返回商跟余数)
try-fix->bignum 将一个普通整数(实数)转换为超大整数
try-bignum->fix 将一个超大整数转换为普通整数(超限则转为实数)
try-bignum->str 将一个超大整数转换为字符串
try-str->bignum 将用数字表示的字符串转换为一个超大整数


下面例子展示的是两个50位数的整数相乘
(setq num1(try-str->bignum "12345678901234567890123456789012345678901234567890")
        x*(try-bignum* num1 num1)
)
(try-bignum->str x*)



续:---------------2021-6-28 13:05----------------

自己发现了加法函数有问题,没有成功进位,已更新附件








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 3明经币 +4 收起 理由
xyp1964 + 2 赞一个!
tigcat + 1 很给力!
Bao_lai + 1 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2021-6-28 13:17 | 显示全部楼层
repeat (length a);循环相减
                                (setq i(1+ i))
                                (setq xa(nth i a)
                                        xb(nth i b))
                                (if (not xb)(setq xb 0))
                                (setq
                                        cha(+ xa xb qian)
                                )
                                (if (> cha 9999);溢出进位
                                        (setq qian 1 cha(- cha 10000))
                                        (setq qian 0)
                                )
                                (setq ret(cons cha ret))
                        )
                                 
                                ""????????????????????????????""                  
       
                        (while (= (car ret)0);循环删除头部的0
                                (setq ret(cdr ret))
                        )
发表于 2022-3-24 23:56 | 显示全部楼层
(defun try-fix->bignum (n / fushu m x)
  (if (< n 0)
    (setq fushu        t
          n (- n)
    )
  )
  (while (/= 0 n)
    (setq m (fix (rem n 10000))
          n (fix (/ n 10000))
          x (cons m x)
    )
  )
  (if (not x)
    (setq x '(0))
  )
  (if fushu
    (cons (- (car x)) (cdr x))
    x
  )
)

评分

参与人数 1明经币 +1 金钱 +5 收起 理由
tryhi + 1 + 5 很给力!

查看全部评分

发表于 2021-6-28 07:33 | 显示全部楼层
本帖最后由 baitang36 于 2021-6-28 08:08 编辑

(setq num2(try-str->bignum "2"))
(setq num1(try-str->bignum "-2")
        x*(try-bignum* num1 num2)
)
(try-bignum->str x*)

结果正确。

(setq num1(try-str->bignum "-2")
        x*(try-bignum* num1 num1)
)
是求平方

评分

参与人数 1明经币 +1 收起 理由
tryhi + 1

查看全部评分

发表于 2021-6-28 01:14 | 显示全部楼层
请继续你的表演

评分

参与人数 1明经币 +1 收起 理由
tryhi + 1

查看全部评分

发表于 2021-6-28 07:59 | 显示全部楼层
本帖最后由 流氓兔 于 2021-6-28 14:10 编辑

(setq num2(try-str->bignum "12345678901234567890123456789012345678901234567890"))
(setq num1(try-str->bignum "-12345678901234567890123456789012345678901234567890")
        x*(try-bignum* num1 num2)
)
(try-bignum->str x*)


已改 问题解决!牛!

点评

(try-bignum* num1 num2),你第二参数写错了,你写成两个num1  发表于 2021-6-28 09:32
发表于 2021-6-28 14:14 | 显示全部楼层
流氓兔 发表于 2021-6-28 07:59
(setq num2(try-str->bignum "12345678901234567890123456789012345678901234567890"))
(setq num1(try-st ...

最重要的代码成功了,离ras 公钥 解密,近在咫尺了,等您1024 2048 lsp
发表于 2021-6-28 19:47 | 显示全部楼层
请继续你的表演
发表于 2021-6-28 23:26 | 显示全部楼层
太厉害了,请继续。
发表于 2021-6-29 18:09 | 显示全部楼层
楼主威武,学习了
发表于 2022-3-17 11:54 | 显示全部楼层
感谢大神的奉献!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-20 12:48 , Processed in 0.318198 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表