Leo field double operation.
(op-field-double arg curve) → result
Function:
(defun op-field-double (arg curve) (declare (xargs :guard (and (valuep arg) (curvep curve)))) (declare (xargs :guard (value-case arg :field))) (let ((__function__ 'op-field-double)) (declare (ignorable __function__)) (b* ((p (curve-base-prime curve)) (x (value-field->get arg)) ((unless (pfield::fep x p)) (reserrf (list :op-field-double (value-fix arg) p)))) (value-field (pfield::add x x p)))))
Theorem:
(defthm value-resultp-of-op-field-double (b* ((result (op-field-double arg curve))) (value-resultp result)) :rule-classes :rewrite)
Theorem:
(defthm op-field-double-of-value-fix-arg (equal (op-field-double (value-fix arg) curve) (op-field-double arg curve)))
Theorem:
(defthm op-field-double-value-equiv-congruence-on-arg (implies (value-equiv arg arg-equiv) (equal (op-field-double arg curve) (op-field-double arg-equiv curve))) :rule-classes :congruence)
Theorem:
(defthm op-field-double-of-curve-fix-curve (equal (op-field-double arg (curve-fix curve)) (op-field-double arg curve)))
Theorem:
(defthm op-field-double-curve-equiv-congruence-on-curve (implies (curve-equiv curve curve-equiv) (equal (op-field-double arg curve) (op-field-double arg curve-equiv))) :rule-classes :congruence)