我想用java来表示一个数学子集关系。在数学中,我们有很好的关系,比如:整数是实数的子集。我试图用一个带有泛型的point类在java中表达这一点:
public class Point<T extends Number> {
protected Number xCoord;
public T getXCoordinate() {
// do some stuff
return (T) this.xCoord;
}
不幸的是,我必须在这里对t进行强制转换,但是我得到了未经检查的转换的通常警告,这是我想要避免的。在这里,如果数字是可示例的就好了,但不幸的是它是抽象的。所以我想知道是否有一个普通的integer和double的可示例化超类(带有显式的零)。我没找到。但在数学上,我们确实有n作为r的子集。如何在java中反映这一点?根据泛型,我的知识到此为止,因为我不能定义一个可示例化的number的子类(比如instnumber)以及integer和double的超类,因为我无法更改java.lang包。那么,有没有人知道如何“使整数的点成为double点的子集”或者找到一个公共的可示例化类号呢。然而,如果不是,为什么类型安全在这一点上如此困难?
最后实现了一种椭圆曲线加密算法。但要做到这一点,通常需要fpxfp(p prime)cnxn中的每个点也是rxr中的一个点。所以我想用这些“数字”来计算,即使我不知道当前的子类型。因为在数学上一个字段在这里是有趣的,所以最好有一种“抽象的”但是可以示例化的子类叫做field of number,它是number的所有子类的父类。在字段中,只要有一个具体的0和1就足够了,这两个0和1存在于数字的大多数子类中。因此,场可能是某个“数学场”,因此是一个显式0和1的集合(就像z/2z实际上是一个数学场)。现在让integer作为field的一个子类。integer类唯一的“附加工作”是将字段的“抽象”0和1Map到integer的具体0和1解释。这也可以为其他子类实现。
我知道联想是不可能的。但是对于编程中的大多数计算和决策来说,最好测试字段元素是0还是1(特别是反转字段元素)。所以我想把自己限制在计算r中现有的数,而不是像nan这样的东西。
很抱歉,我不能给你更多的代码,但我认为它太多的代码,我现在有张贴在这里。简而言之:我有一个projectivepoint类,它必须在rxr中做点的投影加法。但是如果这个类中的计算也可以在fpxfpcrxr上使用,那就太好了。这在数学上或多或少是琐碎的,但我看不到java中当前的解决方案。
1条答案
按热度按时间sxpgvts31#
简而言之:我多次使用多态性进行计算,并使用fp和r的一个示例父类z2。
我已经构建了一个z2扩展fp和fp扩展r(所有示例)的继承树。z2内部的计算很容易编码。相反,fp使用整数来计算模p的不同值(其中p是传递给构造函数的素数)。r(或realnumber)是一个类,它封装了double并使用“double方法”(具有双参数和返回类型的方法)进行计算。我用每个继承的类重写具有不同参数(即fp.add(int,int)或r.add(double,double))的计算方法。由于示例化类z2,我现在可以定义一个prjoectivepoint并对z2进行所有需要的计算。多态性位于我的静态计算器类中,例如add(z2,z2)就是在这里定义的。在我的第一个实现中,我使用instanceof操作符来决定add的z2参数是否真的是一个z2示例,一个r示例的fp示例(实际上,我的意思是明确的,因此fp对象不是r)的示例,在更好的版本中,我想我可以用多态性来代替它。
intvalue()和doublevalue()方法在z2到r之间很常见,并且以预期的方式实现,因为每个类都封装了自己的值。现在我在计算器中的计算可以在z2上“多态地”完成。为了安全起见,我的计算器类有一个引用z2 instancetype=new z2 | fp | r,它依赖于我要计算的字段。我所有的加法、乘法、逆变等方法都在计算器中多态地实现了,现在我可以计算z2上的投影点了。同样,多态性决定了哪些计算是真正在计算器中完成的(因为r扩展了fp扩展了z2)。而且z2是可示例的,这也取得了成功,因为每个计算都可以在z2上进行多态性。
注意,z2中x的公式中的4x也可以写成calculator.add(calculator.add(x,x),calculator.add(x,x));