Нулевая точка на эллиптической кривой

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

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

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

Вот часть класса Point:

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 .


person Luigi D.    schedule 24.03.2015    source источник


Ответы (1)


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

Double.POSITIVE_INFINITY;

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

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

person Michał Szydłowski    schedule 24.03.2015
comment
У меня была такая мысль, но я использую BigDecimals вместо Double, потому что мне, вероятно, придется обрабатывать огромные числа. - person Luigi D.; 24.03.2015
comment
Да, я вижу проблему. Ну, как я уже сказал, насколько мне известно, вы просто не можете реализовать бесконечность в BigDecimal. Однако это Java, поэтому производительность не так критична, я думаю, что определение некоторого значения static, заменяющего бесконечность, никоим образом не повредит вам (но имейте в виду, что это скорее противоречит хорошей практике программирования, и другие пользователи, вероятно, будут меня за это осуждать ;) ). - person Michał Szydłowski; 24.03.2015