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

Автор Dalgerok, история, 6 лет назад, По-русски

Всем привет.

Возникла необходимость сгенерировать множество размера ~15000 и числами до 300000 в котором все суммы двух различных чисел различны.

Множество {1, 2, 3, 4} — плохое, потому что 2 + 3 = 5 и 1 + 4 = 5.

Множество {1, 2, 3} — хорошее.

Никто не знает как быстро генерировать хорошее множество и возможно ли это вообще?

  • Проголосовать: нравится
  • +8
  • Проголосовать: не нравится

»
6 лет назад, # |
  Проголосовать: нравится +19 Проголосовать: не нравится

Различный сумм 600000, а количество пар сильно больше

»
6 лет назад, # |
  Проголосовать: нравится +11 Проголосовать: не нравится

Ничего не получится из-за принципа Дирихле — всевозможных пар будет гораздо больше, чем 600000 — максимально возможная сумма.

»
6 лет назад, # |
Rev. 2   Проголосовать: нравится +33 Проголосовать: не нравится

Такие множества называются множествами Сидона.

Чтобы сгенерировать множество хорошего размера, можно воспользоваться следующим методом: рассмотрим нечетное простое число p. И тогда можно сделать p чисел вида (i2 mod p) * p * 2 + i + 1 для всех i от 0 до p - 1. Это первый метод, который я вспомнил, вроде есть лучше.

»
6 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится

Если интересно, то вот задача на генерацию массива из чисел, у которых количество различных попарных разностей более 90% от всех возможных разностей

  • »
    »
    6 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Среди решений на данную задачу:

    1) Степени чисел с основанием простым числом от 1 до N

    2) Степени двойки по модулю

    3) Степени тройки по модулю

    4) Числа Фибоначчи по модулю

    • »
      »
      »
      6 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится

      Решение при помощи std::rand() дает результат не хуже чем 95%.

      • »
        »
        »
        »
        6 лет назад, # ^ |
          Проголосовать: нравится -10 Проголосовать: не нравится

        Странно, rand() ведь только до 32767

        • »
          »
          »
          »
          »
          6 лет назад, # ^ |
          Rev. 3   Проголосовать: нравится +3 Проголосовать: не нравится

          std::rand() до RAND_MAX, который 32767 на MinGW и 2147483647 на GNU C++ (например, cygwin, clang, gcc). В любом случае, всегда можно использовать std::rand() * std::rand() * std::rand(). Вот мое решение этой задачи