Leo group point doubling operation.
(op-group-double arg curve) → result
Function:
(defun op-group-double (arg curve) (declare (xargs :guard (and (valuep arg) (curvep curve)))) (declare (xargs :guard (value-case arg :group))) (let ((__function__ 'op-group-double)) (declare (ignorable __function__)) (b* ((x (value-group->get arg)) ((unless (curve-subgroupp x curve)) (reserrf (list :input-not-in-subgroup x))) ((mv okp x+x) (curve-subgroup-add x x curve)) ((unless okp) (reserrf (list :output-not-in-subgroup x+x)))) (value-group x+x))))
Theorem:
(defthm value-resultp-of-op-group-double (b* ((result (op-group-double arg curve))) (value-resultp result)) :rule-classes :rewrite)
Theorem:
(defthm op-group-double-of-value-fix-arg (equal (op-group-double (value-fix arg) curve) (op-group-double arg curve)))
Theorem:
(defthm op-group-double-value-equiv-congruence-on-arg (implies (value-equiv arg arg-equiv) (equal (op-group-double arg curve) (op-group-double arg-equiv curve))) :rule-classes :congruence)
Theorem:
(defthm op-group-double-of-curve-fix-curve (equal (op-group-double arg (curve-fix curve)) (op-group-double arg curve)))
Theorem:
(defthm op-group-double-curve-equiv-congruence-on-curve (implies (curve-equiv curve curve-equiv) (equal (op-group-double arg curve) (op-group-double arg curve-equiv))) :rule-classes :congruence)