Rumah >pembangunan bahagian belakang >tutorial php >Cara menggunakan PHP dan GMP untuk melaksanakan ujian keutamaan Fermat bagi nombor besar

Cara menggunakan PHP dan GMP untuk melaksanakan ujian keutamaan Fermat bagi nombor besar

王林
王林asal
2023-07-31 16:52:561334semak imbas

Cara menggunakan PHP dan GMP untuk melaksanakan ujian keutamaan Fermat bagi nombor besar

Pengenalan:
Ujian primaliti Fermat ialah kaedah mudah untuk mengesan sama ada nombor adalah perdana. Kaedah ini berdasarkan teorem kecil Fermat, yang menyatakan bahawa jika p ialah nombor perdana dan a ialah integer positif kurang daripada p, maka a^(p-1) ≡ 1 (mod p). Teorem ini membolehkan kita menguji sama ada sesuatu nombor adalah perdana menggunakan a yang dipilih secara rawak. Dalam artikel ini, kami akan menggunakan perpustakaan PHP dan GMP untuk melaksanakan ujian keutamaan Fermat bagi nombor besar.

Pemasangan dan Persediaan:
Pertama, pastikan anda mempunyai perpustakaan PHP dan GMP dipasang pada sistem anda. Jika anda belum memasangnya lagi, anda boleh memasangnya dengan menjalankan arahan berikut dalam baris arahan:

sudo apt-get install php
sudo apt-get install php-gmp

Seterusnya, buat fail bernama "fermat_prime.php" dan bukanya dengan editor teks.

Laksanakan fungsi ujian keutamaan Fermat:
Tambahkan kod berikut untuk melaksanakan fungsi ujian keutamaan Fermat:

<?php

function is_prime($n, $k)
{
    if ($n <= 1 || $n == 4) {
        return false;
    }
    if ($n <= 3) {
        return true;
    }
 
    while ($k > 0) {
        // 随机选择一个 [2, $n-2] 之间的整数
        $a = gmp_random_range(2, $n-2);
 
        // 使用 GMP 函数进行幂运算
        $res = gmp_powm($a, $n-1, $n);
 
        // 如果不满足费马小定理,则 n 不是素数
        if (gmp_cmp($res, 1) != 0) {
            return false;
        }
        $k--;
    }
 
    return true;
}

Harai kod:

  • Fungsi is_prime menerima dua parameter, $n ialah nombor yang hendak diuji, $k ialah bilangan ujian
  • Fungsi ini mula-mula menyemak sama ada $n antara 1 dan 4, jika ya, ia mengembalikan palsu. Ini kerana 1 atau 4 bukan nombor perdana. is_prime接受两个参数,$n是待测试的数,$k是测试的次数
  • 函数首先检查$n是否在1和4之间,如果是,则返回false。这是因为1和4都不是素数。
  • 接下来,函数使用一个while循环来进行$k次的测试。在每次循环中,函数随机选择一个介于2和$n-2之间的正整数,并使用GMP函数gmp_powm进行幂运算。
  • 最后,函数比较计算出来的幂是否等于1,如果不相等,则返回false,说明该数不是素数。
  • 如果在$k次测试中都通过了费马小定理的验证,函数返回true,说明该数可能是一个素数。

测试代码:
在代码文件的末尾添加以下代码来测试is_primeSeterusnya, fungsi menggunakan gelung sementara untuk melaksanakan ujian $k. Dalam setiap gelung, fungsi secara rawak memilih integer positif antara 2 dan $n-2 dan menggunakan fungsi GMP gmp_powm untuk eksponen.

Akhir sekali, fungsi membandingkan sama ada kuasa yang dikira adalah sama dengan 1. Jika tidak, ia mengembalikan palsu, menunjukkan bahawa nombor itu bukan nombor perdana.

Jika pengesahan Teorem Kecil Fermat diluluskan dalam ujian $k, fungsi itu kembali benar, menunjukkan bahawa nombor itu mungkin nombor perdana.

Uji kod:

Tambah kod berikut pada penghujung fail kod untuk menguji kesan fungsi is_prime:

// 测试1: 检测一个较小的素数
$n = gmp_init("17");
$k = 5;
$result = is_prime($n, $k);
echo $result ? "$n is probable prime
" : "$n is not prime
";
 
// 测试2: 检测一个较大的合数
$n = gmp_init("123456789123456789");
$k = 5;
$result = is_prime($n, $k);
echo $result ? "$n is probable prime
" : "$n is not prime
";

Simpan dan tutup fail.

Jalankan kod:

Jalankan arahan berikut dalam baris arahan untuk melaksanakan fail kod:

php fermat_prime.php

Seterusnya, anda sepatutnya dapat melihat hasil output program dalam baris arahan:🎜
17 is probable prime
123456789123456789 is not prime
🎜Kesimpulan:🎜Ini artikel menerangkan cara menggunakan pustaka PHP dan GMP untuk melaksanakan ujian keutamaan Fermat bagi nombor yang besar. Dengan ujian mudah ini, kita boleh mengetahui sama ada nombor yang lebih besar adalah perdana. Dengan menggunakan kaedah ini, kita boleh memahami Teorem Kecil Fermat dengan lebih baik dan dapat melaksanakan fungsi ujian primaliti asas. 🎜

Atas ialah kandungan terperinci Cara menggunakan PHP dan GMP untuk melaksanakan ujian keutamaan Fermat bagi nombor besar. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn