Haskell Китайская теорема об остатках
Я понимаю, что для того, чтобы эта функция работала, во-первых, crtHasSolution должен быть правдой. У меня возникают проблемы с доказательством того, что n может быть решением, какие-либо идеи или советы о том, как написать или проверить это в haskell?
Я знаю, что условия для N состоят в том, что он должен быть больше или равен 0 и меньше, чем m, который является произведением всех баз модов.
crtHasSolution :: [Integer] -> [Integer] -> Bool
crtHasSolution as ms = length as > 0 &&
length ms > 0 &&
length as == length ms &&
all (>=0) as &&
all (>=2) ms &&
pairwise_coprime ms
-- Is a given number a solution to a CRT problem?
-- usage: crtIsSolution n as ms = ans
-- assures: ans == True, if crtHasSolution as ms == True and n is a solution
-- ans == False, otherwise
crtIsSolution :: Integer -> [Integer] -> [Integer] -> Bool
crtIsSolution n as ms = crtHasSolution as ms &&
n >= 0 &&
n < m
where m =
1 ответ
Из википедии:
Легко проверить, является ли значение
x
является решением: достаточно вычислить остаток от евклидова деленияx
каждым [m_i
].
Если x `mod` m_i /= a_i
для любого i
, затем x
это не решение
Это отдает домашним заданием, поэтому вместо того, чтобы дать вам однострочник, который вычисляет это, я дам вам несколько наводящих вопросов для вашей реализации crtIsSolution n as ms
:
- Является
n
решение, еслиms
а такжеas
пусты? - Если вы можете вычислить,
n `mod` m_0 == a_0
и будьn
это решение дляms_0
а такжеas_0
Можете ли вы вычислить,n
это решение дляm_0:ms_0
а такжеa_0:as_0
?