algorithm - 方案中的扩展欧几里得算法

标签 algorithm math recursion scheme diophantine

我正在尝试为RSA实现的Scheme中的扩展欧几里得算法编写代码。 Instructions

我的问题是我无法编写递归算法,其中内部步骤的输出必须是连续外部步骤的输入。我希望它给出最外层步骤的结果,但正如它所看到的,它给出了最内部步骤的结果。我为此写了一个程序(有点乱,但我没时间编辑。):

(define ax+by=1                     
  (lambda (a b)                     
    (define q (quotient a b))
    (define r (remainder a b))

    (define make-list (lambda (x y)
       (list x y)))

(define solution-helper-x-prime (lambda (a b q r)
   (if (= r 1) (- 0 q) (solution-helper-x-prime b r (quotient b r) (remainder b r)))
))

(define solution-helper-y-prime (lambda (a b q r)
   (if (= r 1) (- r (* q (- 0 q) )) (solution-helper-y-prime b r (quotient b r) (remainder b r))
 ))

(define solution-first-step (lambda (a b q r)
  (if (= r 1) (make-list r (- 0 q))
        (make-list (solution-helper-x-prime b r (quotient b r) (remainder b r)) (solution-helper-y-prime b r (quotient b r) (remainder b r))))
                          ))
  (display (solution-first-step a b q r)) 

))

各种帮助和建议将不胜感激。 (P.S.我添加了给我们的说明的屏幕截图,但我看不到图像。如果有问题,请告诉我。)

最佳答案

这是一个丢番图方程,求解起来有点棘手。我想出了一个迭代解决方案,改编自 this explanation ,但必须将问题分成几部分 - 首先,通过应用 extended Euclidean algorithm 获取商列表:

(define (quotients a b)
  (let loop ([a a] [b b] [lst '()])
    (if (<= b 1)
        lst
        (loop b (remainder a b) (cons (quotient a b) lst)))))

其次,返回并求解方程:

(define (solve x y lst)
  (if (null? lst)
      (list x y)
      (solve y (+ x (* (car lst) y)) (cdr lst)))) 

最后,将它们放在一起并确定解决方案的正确符号:

(define (ax+by=1 a b)
  (let* ([ans (solve 0 1 (quotients a b))]
         [x (car ans)]
         [y (cadr ans)])
    (cond ((and (= a 0) (= b 1))
           (list 0 1))
          ((and (= a 1) (= b 0))
           (list 1 0))
          ((= (+ (* a (- x)) (* b y)) 1)
           (list (- x) y))
          ((= (+ (* a x) (* b (- y))) 1)
           (list x (- y)))
          (else (error "Equation has no solution")))))

例如:

(ax+by=1 1027 712)
=> '(-165 238)
(ax+by=1 91 72)
=> '(19 -24)
(ax+by=1 13 13)
=> Equation has no solution

关于algorithm - 方案中的扩展欧几里得算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53030850/

相关文章:

javascript - jQuery 事件中的递归

c# - 实例化对象中的所有属性和子属性(C#.net)

PHP二叉搜索树,如何遍历

algorithm - 乘以集合并随机与其他集合合并 - Apache Spark

c++ - 确定距离直线一定距离的点

c# - C/C# 中更快的模数?

javascript - 如何使用无内存函数将 256 个唯一字符串映射到整数 (0..255)

algorithm - 在 O(n) 中运行的最小缺失整数算法?

php - 使用公平槽策略从队列中获取下一个任务

c++ - 采访 : Summing numbers in two linked lists