<?php // требует BCMath для арифметики длинных integer
// Китайская теорема об остатках
//
// находит такое число res, что
// res = r (mod a)
// для всего массива (r, a)
//
// res = SUM r*m*mrev,
// где m = произведение всех a кроме очередного,
// mrev - обратный к m в Z/aZ
// вход в виде
// (остаток, основание)
// основания должны быть попарно взаимно просты
// и остаток меньше основания
$data = [
[ 37 , 1487 ] ,
[ 55 , 1511 ] ,
[ 280 , 1523 ] ,
[ 361 , 1543 ] ,
[ 415 , 1549 ] ,
[ 523 , 1553 ] ,
[ 641 , 1559 ]
] ;
// сначала находим произведение Pa всех a
$Pa = 1 ;
foreach ( $data as list ( , $a ) ) $Pa = bcmul ( $Pa , $a ) ;
// заводим массив M слагаемых вида (r, m, mrev)
// где очередное m равно Pa/a
// то есть произведению всех a, кроме очередного
foreach ( $data as list ( $r , $a ) ) { $M [ ] = array ( $r , $m , getMr
( $m , $a ) ) ; }
// считаем res - сумму слагаемых из M
$res = 0 ;
foreach ( $M as list ( $r , $m , $mrev ) ) $res = bcadd ( $res , bcmulClosure
( $r , $m , $mrev ) ) ; echo $res ;
// мультипликативно обратный к a в Z/bZ
function getMr( $a , $b ) {
for ( $i = 1 ; $i < $b ; $i ++ )
}
// обобщение bcmul на несколько аргументов
function bcmulClosure( ... $params ) {
$res = 1 ;
foreach ( $params as $v ) $res = bcmul ( $res , $v ) ; return $res ;
}
?>
PD9waHAgLy8g0YLRgNC10LHRg9C10YIgQkNNYXRoINC00LvRjyDQsNGA0LjRhNC80LXRgtC40LrQuCDQtNC70LjQvdC90YvRhSBpbnRlZ2VyCgogICAgLy8g0JrQuNGC0LDQudGB0LrQsNGPINGC0LXQvtGA0LXQvNCwINC+0LEg0L7RgdGC0LDRgtC60LDRhQogICAgLy8KICAgIC8vINC90LDRhdC+0LTQuNGCINGC0LDQutC+0LUg0YfQuNGB0LvQviByZXMsINGH0YLQvgogICAgLy8gcmVzID0gciAobW9kIGEpCiAgICAvLyDQtNC70Y8g0LLRgdC10LPQviDQvNCw0YHRgdC40LLQsCAociwgYSkKICAgIC8vCiAgICAvLyByZXMgPSBTVU0gciptKm1yZXYsCiAgICAvLyDQs9C00LUgbSA9INC/0YDQvtC40LfQstC10LTQtdC90LjQtSDQstGB0LXRhSBhINC60YDQvtC80LUg0L7Rh9C10YDQtdC00L3QvtCz0L4sCiAgICAvLyBtcmV2IC0g0L7QsdGA0LDRgtC90YvQuSDQuiBtINCyIFovYVoKICAgIAogICAgLy8g0LLRhdC+0LQg0LIg0LLQuNC00LUKICAgIC8vICjQvtGB0YLQsNGC0L7Quiwg0L7RgdC90L7QstCw0L3QuNC1KQogICAgLy8g0L7RgdC90L7QstCw0L3QuNGPINC00L7Qu9C20L3RiyDQsdGL0YLRjCDQv9C+0L/QsNGA0L3QviDQstC30LDQuNC80L3QviDQv9GA0L7RgdGC0YsKICAgIC8vINC4INC+0YHRgtCw0YLQvtC6INC80LXQvdGM0YjQtSDQvtGB0L3QvtCy0LDQvdC40Y8KICAgICRkYXRhID0gWwogICAgICAgIFszNywgIDE0ODddLAogICAgICAgIFs1NSwgIDE1MTFdLAogICAgICAgIFsyODAsIDE1MjNdLAogICAgICAgIFszNjEsIDE1NDNdLAogICAgICAgIFs0MTUsIDE1NDldLAogICAgICAgIFs1MjMsIDE1NTNdLAogICAgICAgIFs2NDEsIDE1NTldCiAgICBdOwogICAgCiAgICAKICAgIC8vINGB0L3QsNGH0LDQu9CwINC90LDRhdC+0LTQuNC8INC/0YDQvtC40LfQstC10LTQtdC90LjQtSBQYSDQstGB0LXRhSBhCiAgICAkUGEgPSAxOyAKICAgIGZvcmVhY2ggKCRkYXRhIGFzIGxpc3QoICwkYSkpICRQYSA9IGJjbXVsKCRQYSwgJGEpOwogICAgCiAgICAvLyDQt9Cw0LLQvtC00LjQvCDQvNCw0YHRgdC40LIgTSDRgdC70LDQs9Cw0LXQvNGL0YUg0LLQuNC00LAgKHIsIG0sIG1yZXYpCiAgICAvLyDQs9C00LUg0L7Rh9C10YDQtdC00L3QvtC1IG0g0YDQsNCy0L3QviBQYS9hCiAgICAvLyDRgtC+INC10YHRgtGMINC/0YDQvtC40LfQstC10LTQtdC90LjRjiDQstGB0LXRhSBhLCDQutGA0L7QvNC1INC+0YfQtdGA0LXQtNC90L7Qs9C+CiAgICBmb3JlYWNoICgkZGF0YSBhcyBsaXN0KCRyLCAkYSkpewogICAgICAgICRtID0gYmNkaXYoJFBhLCAkYSk7CiAgICAgICAgJE1bXSA9IGFycmF5KCRyLCAkbSwgZ2V0TXIoJG0sICRhKSk7CiAgICB9IAoKICAgIC8vINGB0YfQuNGC0LDQtdC8IHJlcyAtINGB0YPQvNC80YMg0YHQu9Cw0LPQsNC10LzRi9GFINC40LcgTQogICAgJHJlcyA9IDA7CiAgICBmb3JlYWNoICgkTSBhcyBsaXN0KCRyLCAkbSwgJG1yZXYpKQogICAgICAgICRyZXMgPSBiY2FkZCgkcmVzLCBiY211bENsb3N1cmUoJHIsICRtLCAkbXJldikpOyAgIAogICAgZWNobyAkcmVzOwogICAgCiAgICAKICAgIC8vINC80YPQu9GM0YLQuNC/0LvQuNC60LDRgtC40LLQvdC+INC+0LHRgNCw0YLQvdGL0Lkg0LogYSDQsiBaL2JaCiAgICBmdW5jdGlvbiBnZXRNcigkYSwgJGIpewogICAgICAgIGZvciAoJGkgPSAxOyAkaSA8ICRiOyAkaSsrKQogICAgCSAgICBpZihiY21vZChiY211bCgkYSwgJGkpLCAkYikgPT0gMSkgcmV0dXJuICRpOwogICAgfQoKICAgIC8vINC+0LHQvtCx0YnQtdC90LjQtSBiY211bCDQvdCwINC90LXRgdC60L7Qu9GM0LrQviDQsNGA0LPRg9C80LXQvdGC0L7QsgogICAgZnVuY3Rpb24gYmNtdWxDbG9zdXJlKC4uLiRwYXJhbXMpewogICAgICAgICRyZXMgPSAxOwogICAgICAgIGZvcmVhY2goJHBhcmFtcyBhcyAkdikkcmVzID0gYmNtdWwoJHJlcywgJHYpOwogICAgICAgIHJldHVybiAkcmVzOwogICAgfQoKPz4=