【问题标题】:PHP - Manipulate large numbers without store themPHP - 处理大量数字而不存储它们
【发布时间】:2016-01-24 21:25:03
【问题描述】:

我正在尝试解决来自 rosalind.info 的生物信息学问题,但我被这个问题锁定了:http://rosalind.info/problems/mrna/

要解决这个问题,您必须计算可以翻译蛋白质的不同 RNA 字符串的数量,以 1,000,000 为模。

生物学背景:一个protein是一个由20个amino acids组成的字符串,用20个不同的字母表示。每个氨基酸可以替换为多个RNA 字符串(由 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;
} ?>

【问题讨论】:

  • 提示:作为热身,你可以尝试找出在你的程序中用括号明确数字运算优先级的方法
  • @tomc 我不明白你的评论,使“数字运算优先级显式”是什么意思?
  • 你有 ` $r *= $aa[$base] % 1000000;` 这是 ` $r *= ($aa[$base] % 1000000);` 因为$aa[$base] 是总是比1000000 小得多,你实际上有`$r *= $aa[$base];` 明确地写优先级会得到正确的`$r = (r * $aa[$base]) % 1000000;'跨度>

标签: php bioinformatics


【解决方案1】:

我终于能够解决这个问题了。首先,就像在 cmets 中添加的问题@Gavriel 所说,我不得不使用 GMP 库来进行这些大数字操作。其次,我最后错过了每 3 的乘法。这是必要的,因为如果蛋白质完成,必须有一个终止密码子(序列)。

/*
    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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多