我正在尝试从rosalind.info解决生物信息学问题,我对此问题无法解决:http://rosalind.info/problems/mrna/
要解决这个问题,你必须计算蛋白质可以翻译的不同RNA字符串的数量,模数为1,000,000。
生物背景:protein是一个由20 amino acids组成的字符串,用20个不同的字母表示。每个氨基酸可以被多个RNA字符串替换(每个字母由3个字母组成)。
这个问题可以让您了解如何在编程时管理大量数字,这是生物信息学中的一个常见案例。我尝试了不同的东西,但我总是得到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;
} ?>
答案 0 :(得分:0)
我终于能够解决问题了。首先,就像@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;
}