PHP - 处理大数字而不存储它们

时间:2016-01-24 21:25:03

标签: php bioinformatics

我正在尝试从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;
} ?>

1 个答案:

答案 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;
}