Блог пользователя Salat

Автор Salat, 14 лет назад, По-русски
Интересная задача, магия с Евклидом правда непонятна.

Для прояснения хотелось бы получить ответы на следующие вопросы:
1) как найти количество точек принадлежащих отрезку, координаты которых — целые числа?
или не отрезку, а прямой ограниченной ( - 2·109 ≤ A, B, C ≤ 2·109

2) можно ли на окружности найти такую точку, и как найти количество таких точек на окружности?
  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
а зачем искать количество целочисленных точек? тут в принципе достаточно решить диофантово уравнение. Для этого найти сначала частное решение (x0, y0), затем выразить общее решение через целочисленный параметр, например n. И посмотреть существует ли решение в указанном промежутке -5*10^8 <= x, y <= 5*10^8
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Там 1018
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      да, верно...но это похоже особо не влияет!? разве нет?
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Unable to parse markup [type=CF_HTML]

        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Все по делу. "\eq" выглядит очень странно. По-моему, такого просто нет.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        просто для ограничения 5· 1018 можно написать точную формулу для x, y которые уж точно влезут, двигать туда-сюда не надо :)
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          а как это написать?
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Из http://en.wikipedia.org/wiki/Diophantine_equation
            "
            Linear Diophantine equations take the form ax + by = c. If c is the greatest common divisor of a and b then this is Bézout's identity, and the equation has an infinite number of solutions. These can be found by applying the extended Euclidean algorithm. It follows that there are also infinite solutions if c is a multiple of the greatest common divisor of a and b. If c is not a multiple of the greatest common divisor of a and b, then the Diophantine equation ax + by = c has no solutions.
            "
            Т.е. значала проверяем, есть ли решения вообще.
            (если C mod gcd(A, B) <> 0, то их нет).

            Если есть, то решение существует.
            Далее, как найти это решение?

            Далее примем d = gcd(A, B)

            Существует тождество Безу
            http://en.wikipedia.org/wiki/B%C3%A9zout%27s_identity

            Оно выглядит так Ax+By=GCD(A, B).
            Решается расширенным Эвклидом.

            Наше уравнение не является тождеством Безу, но
            можно решить тождество A*x' + B*y'=GCD(A, B) с нашими A, B Эвклидом.

            Оно немного отличается от нашего уравнения Ax+By=-C.
            Чем? Тем, что мы решаем его не для правой части = -C, а для d, т.е. для правой части, которая в сколько то раз (в -C/d) меньше, чем -С.


            Следовательно,

            x = x'*(-C/d), y = y'*(-C/d)
            (полученные x', y' просто умножаются на то, во сколько раз -C больше d).
            Минус появляется при переносе знака C.

            В коде:

                d = extended_gcd(a, b);
                if (c % d != 0)
                    cout <<-1;
                else
                    cout <<lastx * (-c / d)<<" " <<lasty * (-c / d);

            lastx, lasty- рез-ты работы расширенного алгоритма Эвклида.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Не уверен, что понял про точную формулу, но вот такой вопрос. Почему проходит алгоритм Эвклида без дальнейшей проверки рез-та на попадание в интервал I=[-5e18;5e18]? Нестрого я могу это понять, представив уравнение в виде y=kx+b, и сравнив порядок смещения b и коэффициента k с I. Но а строгое доказательство? Какой должен быть  I, чтобы x и y, найденные через Extended euclid, не попали в интервал?
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
По пункту 2 можно решить (или прочитать решения) две задачи:
GridPointsOnCircle
PointsOnCircle