首页 > 其他分享 >【数论】Rust使用Miller-Rabin primality test判别素数

【数论】Rust使用Miller-Rabin primality test判别素数

时间:2023-05-20 09:00:32浏览次数:51  
标签:mut return unwrap Miller i128 primality let result test

题目地址

https://ac.nowcoder.com/acm/contest/57677/A

代码

use std::io::{self, BufRead, Write};

fn is_prime_triival(n: i128) -> bool {
    if n <= 1 {
        return false;
    }
    if n == 2 {
        return true;
    }
    if n % 2 == 0 {
        return false;
    }
    let mut i = 3;
    while (i as f64) <= (n as f64).sqrt() {
        if n % i == 0 {
            return false;
        }
        i += 2;
    }
    true
}


fn power(mut a: i128, mut b: i128, m: i128) -> i128 {
    let mut result = 1;
    a %= m;
    while b > 0 {
        if b % 2 != 0 {
            result = (result * a) % m;
        }
        b >>= 1;
        a = (a * a) % m;
    }
    result
}

fn is_prime(n: i128) -> bool {
    if n < 2 {
        return false;
    }
    if n != 2 && n % 2 == 0 {
        return false;
    }
    let s = ((n - 1) as u128).trailing_zeros() as i128;
    let d = (n - 1) / 2i128.pow(s as u32);

    let witnesses: [i128; 12] = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37];
    'next_witness: for &a in witnesses.iter().take_while(|&&x| x <= n - 1) {
        let mut x = power(a, d, n);
        if x == 1 || x == n - 1 {
            continue;
        }
        for _r in 1..s {
            x = power(x, 2, n);
            if x == n - 1 {
                continue 'next_witness;
            }
        }
        return false;
    }
    true
}





fn solve(_n: i128) -> i128 {
    if _n == 1 {
        return 1;
    } else if _n == 4 {
        return 4;
    } else {
        let mut n = _n;
        while !is_prime(n) {
            n -= 1;
        }
        return n;
    }
}

fn main() {
    let stdin = io::stdin();
    let mut lines = stdin.lock().lines();
    let t: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();

    let stdout = io::stdout();
    let mut writer = io::BufWriter::new(stdout.lock());
    for _ in 0..t {
        let n: i128 = lines.next().unwrap().unwrap().trim().parse().unwrap();
//         println!("n {}", is_prime(n));
        let result = solve(n);
        writeln!(&mut writer, "{}", result).unwrap();
    }
}

标签:mut,return,unwrap,Miller,i128,primality,let,result,test
From: https://www.cnblogs.com/yhm138/p/17416736.html

相关文章

  • 基于FPGA的Hamming编译码verilog开发实现,包括testbench测试程序
    1.算法仿真效果vivado2019.2仿真结果如下:    2.算法涉及理论知识概要        汉明码(HammingCode),是在电信领域的一种线性调试码,以发明者理查德·卫斯里·汉明的名字命名。汉明码在传输的消息流中插入验证码,当计算机存储或移动数据时,可能会产生数据位错误,以侦......
  • 云原生之使用docker部署TestLink测试平台
    (云原生之使用docker部署TestLink测试平台)一、TestLink介绍TestLink是基于web的测试用例管理系统,主要功能是测试用例的创建、管理和执行,并且还提供了一些简单的统计功能。二、TestLink的特点测试需求管理测试用例管理测试用例对测试需求的覆盖管理测试计划的制......
  • 2023 Hubei Provincial Collegiate Programming Contest
    C.DarknessI首先根据短边放一条对角线,然后往后每隔一列只放一个即可。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongint32_tmain(){ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);intn,m;cin>>n>>m......
  • 2023 CCPC Henan Provincial Collegiate Programming Contest
    A.小水獭游河南a的长度小于26,所以直接暴力枚举暴力判断。#include<bits/stdc++.h>usingnamespacestd;voidsolve(){strings;cin>>s;if(s.size()==1){cout<<"NaN\n";return;}map<char,int>cnt;......
  • AtCoder Regular Contest 133 E Cyclic Medians
    洛谷传送门AtCoder传送门其实是套路题,但是为什么做不出来啊第一步就是经典套路。枚举\(k\),统计中位数\(>k\)的方案数,加起来就是中位数的总和。那么现在\(x_{1\simn},y_{1\simm}\)就变成了\(0/1\)序列,考虑一次操作,如果\((x,y)=(0,0)\),那么\(a\)会变成\(0\)......
  • Creating your own OpenID Connect server with ASOS: testing your authorization se
    Thispostistheeighthpartofaseriesofblogpostsentitled CreatingyourownOpenIDConnectserverwithASOS:IntroductionChoosingtherightflow(s)RegisteringthemiddlewareintheASP.NETCorepipelineCreatingyourownauthorizationproviderI......
  • About #[tokio::test]
    #[tokio::test]运行时#[tokio::test]运行时和#[tokio::main]的默认值是不一样的,前者默认单线程,后者默认多线程:Thedefaulttestruntimeissingle-threaded.所以有的时候运行和测试的结果可能不同。可以设置为多线程的风格:#[tokio::test(flavor="multi_thread",wor......
  • AtCoder Regular Contest 124 F Chance Meeting
    洛谷传送门AtCoder传送门感觉挺高妙的……为了方便,不妨把横纵坐标都整体减\(1\)。如果单独考虑上下移动,方案数是\(\binom{2n}{n}\)。发现两个人上下总共移动\(n\)次后一定会在同一行,设这行编号为\(x\),那么最后带个\(\binom{n}{x}^2\)的系数,并且除掉上下移动后方案本质......
  • testng数据驱动返回map和string两种方式
    1.yaml数据展示user.yaml#登录接口正确的用户名密码-'uri':'/console/index.html#/login''username':'liqiang1''password':'111111'#错误的接口数据-'uri':'/console/index.html#/login'......
  • Pytest根据命令行参数使用动态数据进行参数话数据驱动
    Python中有一个重要的特性是,装饰器、类属性、模块变量都是模块加载时立即执行的。因此在使用@pytest.mark.parametrize进行参数话的时候,数据一般是确定的,如下例:importpytestDATA=["a.txt","b.txt","c.txt",]@pytest.mark.parametrize('filepath',DATA)......