2015-03-24 3 views
1

Я работаю над библиотекой, которая позволяет мне работать с эллиптическими кривыми. Он все еще находится в эмбриональном состоянии, и до сих пор он состоит только из двух классов: EllipticCurve и Точка.Точка нуля на эллиптической кривой

Сейчас я реализует основные операции существования, принадлежность, сумма, отражение и т.д.

К сожалению, я застрял теперь, что я должен реализовать концепцию нуля, т.е. точку эллиптическая кривая E, пересекающая линию через P и -P, где P = (x, y) и -P = (x, -y). Итак, мой вопрос можно перефразировать как «как я могу реализовать точку на бесконечности?»

Вот часть класса точки до сих пор:

public class Point implements Comparable<Point> { 
    private static final BigDecimal MINUSONE = new BigDecimal(-1); 

    private BigDecimal x; 
    private BigDecimal y; 
    private EllipticCurve e; 

    public Point(BigDecimal x, BigDecimal y, EllipticCurve e) { 
     if(x != null && y != null && e != null) { 
      if(liesOn(x,y,e)) { 
       this.x = x; 
       this.y = y; 
       this.e = e; 
      } 
     } 
    } 

    public Point reflect() { 
     return new Point(x,y.multiply(MINUSONE),e); 
    } 

    public Point add(Point o) { 
     if(this.e == o.getE()) { 
      if(this == o) { 
       return this.multiply(2); 
      } 
      if(o == this.reflect()) { 
       return /*THE INFAMOUS ZERO POINT*/; 
      } 

      BigDecimal a; 
      BigDecimal b; 

      /* 
      * computation I still haven't implemented 
      */ 

      return new Point(a,b,e); 
     } 
    } 
    /* 
    * other methods 
    */ 
} 

PS: Я знаю о существовании java.security.spec.EllipticCurve, но так как я собираюсь использовать этот класс в основном для математических целей я почувствовал необходимость создать свою личную библиотеку ex novo.

ответ

1

Невозможно представить бесконечность как таковую, используя BigDecimal. Единственный путь в Java Я знаю:

Double.POSITIVE_INFINITY; 

Integer или, Float и т.д. Вы также не можете взять valueOf из сказанного выше, так как он будет бросать NumberFormatException.

Вы можете использовать обходной путь, i. е. очень большое значение, которое вы знаете, всегда будет больше, чем любое другое.

+0

У меня была эта мысль в моем сознании, но я использую BigDecimals вместо Double, потому что мне, вероятно, придется обрабатывать огромные числа. –

+0

Да, я вижу проблему. Ну, как я уже сказал, насколько мне известно, вы просто не можете реализовать бесконечность в BigDecimal. Это, однако, Java, поэтому производительность не такая критическая, я думаю, что определение некоторого значения 'static', заменяющего бесконечность, никоим образом не повредит вам (но имейте в виду, что это скорее против хорошей практики программирования, и другие пользователи, вероятно, для этого ;)). –