gpt4 book ai didi

Java自定义数值接口(interface)——平方根

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:40:39 25 4
gpt4 key购买 nike

问题是关于在通用数值接口(interface)中定义平方根算法的问题的策略方法。我知道存在解决不同条件下问题的算法。我对以下算法感兴趣:

  • 仅使用选定的函数解决问题;
  • 不关心操作的对象是整数、 float 还是其他,只要这些对象可以加、乘、对;
  • 如果输入是一个完美的正方形,则返回一个精确解。

由于区别的微妙性以及为了清晰起见,我将以非常冗长的方式定义问题。当心墙上的文字!


假设有一个 Java 接口(interface) Constant<C extends Constant<C>>使用以下抽象方法,我们将调用基本函数:

  • C add(C a);
  • C subtract(C a);
  • C multiply(C a);
  • C[] divideAndRemainder(C b);
  • C additiveInverse();
  • C multiplicativeInverse();
  • C additiveIdentity();
  • C multiplicativeIdentity();
  • int compareTo(C arg1);

不知道 C 代表整数还是 float ,也不一定与以下讨论相关

仅使用这些方法就可以创建 staticdefault一些关于数字的数学算法的实现:例如,dividerAndRemainder(C b);compareTo(C arg1);允许为更大公约数、bezout 身份等创建算法...

现在假设我们的接口(interface)有一个 default求幂方法:

public default C pow(int n){
if(n < 0) return this.additiveInverse().pow(-n);
if(n == 0) return additiveIdentity();
int m = n;
C output = this;
while(m > 1)
{
if(m%2 == 0) output = output.multiply(output);
else output = this.multiply(output.multiply(output));
m = m/2;
}
return output;
}

目标是定义两个default方法称为 C root(int n)C maximumErrorAllowed()这样:

  • x.equals(y.pow(n))暗示 x.root(n).equals(y) ;
  • C root(int n);实际上是仅使用基本函数和从基本函数创建的方法实现
  • 该接口(interface)仍然可以应用于任何类型的数字,包括但不限于整数和 float 。
  • this.root(n).pow(n).compareTo(maximumErrorAllowed()) == -1对于所有 this这样 this.root(n)!=null ,即任何最终近似值的误差都小于 C maximumErrorAllowed() ;

这可能吗?如果是,计算复杂度的估计方法和内容是什么?

最佳答案

我花了一些时间在 Java 的自定义数字界面上工作,这非常困难——这是我使用 Java 最令人失望的经历之一。

问题是你必须从头开始——你不能真正重用 Java 中的任何东西,所以如果你想要 int、float、long、BigInteger、rational、Complex 和 Vector 的实现,你必须自己为每个类实现所有方法,然后不要指望 Math 包会有很大帮助。

实现“组合”类特别令人讨厌,例如由两种“通用”浮点类型组成的“复杂”,或由两种通用整数类型组成的“有理”。

而且数学运算符是正确的——这可能特别令人沮丧。

我让它运行良好的方法是用 Java 实现类,然后用 Groovy 编写一些更高级的东西。如果您正确命名这些操作,Groovy 就可以选择它们,就像如果您的类实现了“.plus()”,那么 groovy 会让您执行 instance1+instance2。

IIRC 由于是动态的,Groovy 通常可以很好地处理跨类片段,就像如果您说 Complex + Integer,您可以提供从 Integer 到 complex 的转换,而 groovy 会将 Integer 提升到 Complex 以执行操作并返回一个复数。

Groovy 与 Java 完全可以互换,您通常只需重命名一个 Java 类“.groovy”并编译它就可以工作,所以这是一个很好的折衷方案。

虽然这是很久以前的事了,但现在您可能会在“数字”接口(interface)中使用 Java 8 的默认方法——这可以使一些类的实现更容易,但可能无济于事——我不得不再试一次以找出答案,但我不确定是否要重新打开那个 can o' worms。

关于Java自定义数值接口(interface)——平方根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34091761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com