在Scala中建模椭圆曲线

时间:2016-02-27 15:27:35

标签: scala math inner-classes

我正在Scala中构建一个小项目,向非程序员演示椭圆曲线加密的算法基础知识。表现并不重要。相反,它必须非常通用和模块化,例如允许在不同的字段上定义不同的曲线并使用它们。到目前为止,我还没有设法使结构正确。

我有四个基本课程:EllipticCurvePoint(曲线上),FiniteFieldElement(字段)。

以下是我正在处理的一些限制因素:

  • 应该可以将Element的任意两个实例加在一起,但结果取决于存储在FiniteField的特定实例中的缩减规则。它们是。{/ p >

  • 应该可以将曲线上的任意两个点加在一起,但结果取决于这两个点所在的特定曲线的等式。

  • 最后,点的添加还取决于操作点坐标的FiniteField的特定实例,即FiniteField提供加法,乘法,取幂等的实现。

到目前为止,我使用内部类(Point是内部类EllipticCurveElement内部类FiniteField)获得了最佳结果。这有点笨拙,我失去了几个隐含的def,我使用它(和我的DSL一起)使用整数和类似数学的表示法实例化字段元素:

val x: Element = 1
val y: Element = 23 u + 17   // an element of a degree 2 field extension

Element内定义FiniteField时,这些隐式方法无法再看到它。

鉴于上述限制,表示这四个类之间关系的最佳方式是什么?

编辑:我意识到我的问题很模糊。以下是一个如何使用我的程序来演示Weil配对的双线性属性的示例。

// Construct a field with 23^2 = 529 elements, using a root of X^2 + 1 = 0
val fld = new FiniteField(23, 2)

// Define a curve over fld with coefficients -1 and 0
// i.e. y^2 = x^3 - x
val ec = new EllipticCurve(-1, 0, fld)

// Take a point on the curve ec
val p = new Point(2, 11, ec)

// Take another point, not in the subgroup generated by p
val q = new Point(21, 12 u, ec)  // where u^2 + 1 = 0

val result1 = ec.weil(p, q)      // this gives 15 u + 11
val result2 = ec.weil(p * 2, q)  // this gives 8 u + 11

// Verifying the results
val check = (15 u + 11).pow(2)   // this gives 8 u + 11, as required

// ... similarly for ec.weil(p, q * 2)

我更愿意允许更自然地定义Point(例如作为元组),而不是尾随ec。 Scala是否允许以更聪明的方式将ec传递给Point构造函数?有没有办法隐含地做到这一点?

0 个答案:

没有答案