биоинформатика — манипулируйте большими числами, не сохраняя их

Я пытаюсь решить проблемы биоинформатики с rosalind.info, и я заблокирован с этой проблемой: http://rosalind.info/problems/mrna/

Чтобы решить эту проблему, вы должны рассчитать количество различных строк РНК, из которых белок мог быть переведен, по модулю 1 000 000.

Биологический фон: A белок это строка, состоящая из 20 аминокислоты представлены 20 разных букв. Каждую аминокислоту можно заменить более чем одной РНК строка (состоит из 3 букв каждая 1).

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

Сами проблемы предполагают, что я должен найти способ манипулирования большими числами без необходимости их хранения. Как это возможно? Как я могу добиться этого с помощью PHP?

Это мое лучшее до сих пор

<?php function protein_reverse($sec) {
$sec_arr = str_split($sec);
$aa = array(
'F' => '2',
'L' => '6',
'S' => '6',
'Y' => '2',
'C' => '2',
'W' => '1',
'P' => '4',
'H' => '2',
'Q' => '2',
'R' => '4',
'I' => '3',
'M' => '1',
'T' => '4',
'N' => '2',
'K' => '2',
'V' => '4',
'A' => '4',
'D' => '2',
'E' => '2',
'G' => '4',
);
$r = 1;
foreach ( $sec_arr as $base ) {
$r *= $aa[$base] % 1000000;
}
return $r;
} ?>

2

Решение

Я наконец смог решить проблему. Во-первых, как говорит вопрос @Gavriel, добавленный в комментариях, мне пришлось использовать библиотеку GMP для этих операций с большими числами. Во-вторых, мне не хватало умножения на 3 в конце. Это необходимо, потому что, если белок закончен, должен быть кодон терминации (secuence).

/*
Reverse translation of protein
@return number of possible RNA strings modulo 1000000
*/
function protein_reverse($sec) {
$sec_arr = str_split($sec);
$aa = array(
'F' => '2',
'L' => '6',
'S' => '6',
'Y' => '2',
'C' => '2',
'W' => '1',
'P' => '4',
'H' => '2',
'Q' => '2',
'R' => '6',
'I' => '3',
'M' => '1',
'T' => '4',
'N' => '2',
'K' => '2',
'V' => '4',
'A' => '4',
'D' => '2',
'E' => '2',
'G' => '4',
);
$r = 1;
foreach ( $sec_arr as $base ) {
$r = gmp_mul($r, $aa[$base]);
}
$r = gmp_mul($r, 3);
$r = gmp_mod($r, 1000000);
return $r;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector