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