Заполнение вектора чисел для выставления ошибки в реализации функции

cs.stackexchange https://cs.stackexchange.com/questions/130116

Вопрос

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

Это происходит для меня, однако, что может быть возможно заполнить значения вектора, так что я все еще могу проверить все возможные вектор под определенным размером до тех пор, пока я даю определенное предположение о реализации функции в тесте.

Скажем, у меня есть функция $ f: \ mathbb {n} ^ n \ to \ mathbb {n} $ такое, что $ f (x)=sum_ {i= 1} ^ nc_i \ prod_ {j= 1} ^ n x_j ^ {e_ {ij}} $ для некоторых $ E $ и $ C $ такой, что $ e_ {ij} \ in \ {0,1 \} $ и $ c_i \ in \ {0, 1 \} $ . Я хочу посмотреть, равно ли это некоторую известную золотую функцию $ G $ Но мне придется вручную работать $ g $ для конкретных входов. Я верю, что это правда, что существует входной $ R $ такой, что $ f (R) $ Уникально определяет $ f $ . Это делает тестирование, чтобы увидеть, если особенно реализация $ F $ - это тот, который мы ожидаем тривиально легко.

для $ n= 2 $ Возможные значения $ f (3, 7) $ следующие: 0, 1, х= 3, y= 7, xy= 21, 2, 1 + x= 4, 1 + y= 8, 1 + xy= 22, х + х= 6, х + y= 10, х + xy= 24, xy + xy= 42

Так что, если я сделаю предположение, что функция Partiuclar, я проверяю, имеет вышесказанную, характеризующуюся $ C $ и $ E $ Тогда мне нужен только один вход для полной проверки реализации $ F $ .

Хороший эвристический эвристический для генерации этих входов - начать с первого премьера выше количества терминов, которые у вас есть, а затем попробуйте последовательно более высокие простые простые простыни для каждого следующего ввода, пока вы не получите несколько изгиб. Интуиция состоит в том, что никакие две продукты не будут одинаковыми, потому что вы выбрали простые простыни, и что каждый уникальный продукт будет расположен настолько настолько, что суммы также будут также уникальными.

Есть ли алгоритм для генерации ввода к такой функции, что делает все возможные такие функции приводят к уникальным значениям? Что, если мы готовы быть вероятностями в некотором смысле, например, «ожидаемый выход , вероятно, Уникальные для этого ввода»? Есть ли другие формы функций, для которых этот вопрос был изучен?

Это было полезно?

Решение

многолинейные полиномы

Если вы готовы использовать вероятностные методы, я предлагаю использовать рандомизированный алгоритм для тестирования полиномиальной идентичности.

Вы хотите проверить, стоит ли $ f (x)= g (x) $ для всех $ x $ < / span>, где $ f, g $ - многоуровневые оолиномы. Это экземпляр Тестирование полиномиальной идентичности Проблема. Существуют эффективные рандомизированные алгоритмы для тестирования полиномиальной идентичности.

Чтобы сделать этот ответ самостоятельно, я дам вам краткий обзор разумного алгоритма. Во-первых, случайным образом выберите большой Prime $ P $ . Далее, случайно выбрать $ x= (x_1, \ dots, x_n) $ , с каждым элементом $ x_i $ Однорадно выбрано на случайном модуле $ p $ . Наконец, проверьте, стоит ли $ p (x) \ equiv g (x) \ pmod p $ . Если нет, то вы знаете, что ваша реализация неисправна. Если да, то ваша реализация имеет хороший шанс быть хорошим. (В частности, неисправная реализация, вычисляющая некоторые другие многолинейные полиномиальные, имеет низкую вероятность обнаружения незамеченной, благодаря Schwartz-Zipple Lemma .) Вы можете повторить эту процедуру несколько раз для более сильных гарантий.

Эта процедура предполагает, что вы можете осмотреть код алгоритма и убедитесь, что вычисляет многолинейный полиномиальный, который, кажется, что ваша вопрос предлагает предположить, что мы можем предположить. Если у вас есть полный черный ящик, и вы не знаете, вычисляют ли он многолинейный полиномиал или нет, вы не можете получить сильные гарантии, что $ F $ будет правильным везде Например: Например, ваша реализация $ f $ может быть правильным на всех, кроме одного ввода, где оно специально, чтобы выдвигать неправильный ответ.

Больше общих случаев

Вас может быть заинтересован в теории самостоятельной тестирования, пионун Blum, Luby, Rubinfeld и дальнейшей разработанной другими. Смотрите, например, следующая семанная бумага:

Самостоятельное тестирование / Исправление с приложениями к численным проблемам . Ручной Blum Michael Luby, Ronitt Rubinfeld. Журнал компьютерных и системных наук, 47 (3), 549-595.

Они обобщают вашу идею, учитывая тестеры, которые вызывают программу-тест несколько раз; Позволяя вероятностям тестам, где есть шанс, мы не сможете заметить проблемы, но эта вероятность может контролироваться или ограничена; И, позволяя для самоочередной коррекции, где мы используем возможно неисправную программу в качестве подпрограммы для построения вывода, которые будут правильными с высокой вероятностью. Тем не менее, несмотря на эти обобщения, класс функций, которые мы знаем, как построить эффективные самоуправления для довольно ограниченного, и мы не знаем, как это сделать для произвольных функций.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с cs.stackexchange
scroll top