C#,因数分解(质因子分解)Pollard‘s Rho算法的源代码

因数分解(也称为质因子分解):将一个大整数分解它的质因子之乘积的算法。

Pollard Rho算法的基本思路:先判断当前数是否是素数(质数),如果是,则直接返回。如果不是,继续找到当前数的一个因子(可以不是质因子)。然后递归对该因子和约去这个因子的另一个因子进行分解。

运行效果:

源代码:

using System;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
    /// <summary>
    /// 用Pollard-Rho算法求合成质数因子
    /// </summary>
    public static class Prime_Factorization
    {
        /// <summary>
        /// 随机数发生器
        /// </summary>
        private static Random rand = new Random((int)DateTime.Now.Ticks);

        /// <summary>
        /// 计算 x 幂取模
        /// </summary>
        /// <param name="x"></param>
        /// <param name="exponent"></param>
        /// <param name="modulus"></param>
        /// <returns></returns>
        private static long ModularPow(long x, int exponent, long modulus)
        {
            long result = 1;
            while (exponent > 0)
            {
                // 如果 y 是奇数!
                if ((exponent % 2) == 1)
                {
                    result = (result * x) % modulus;
                }
                exponent = (exponent >> 1);

                x = (x * x) % modulus;
            }
            return result;
        }

        /// <summary>
        /// 计算 n 的分解质因子(除)算法
        /// </summary>
        /// <param name="n"></param>
        /// <returns></returns>
        public static long PollardRho(long n)
        {
            if (n == 1)
            {
                return n;
            }
            // 偶数
            if ((n % 2) == 0)
            {
                return 2;
            }

            // 设置一个取值范围
            long x = (long)(rand.Next(0, -(int)n + 1));
            long y = x;

            long c = (long)(rand.Next(1, -(int)n));

            // 初始化候选除数(或结果),直到未获得素数因子。
            long d = 1L;
            while (d == 1)
            {
                x = (ModularPow(x, 2, n) + c + n) % n;

                y = (ModularPow(y, 2, n) + c + n) % n;
                y = (ModularPow(y, 2, n) + c + n) % n;

                d = GCD(Math.Abs(x - y), n);

                if (d == n)
                {
                    return PollardRho(n);
                }
            }

            return d;
        }

        public static long GCD(long a, long b)
        {
            return ((b == 0) ? a : GCD(b, (a % b)));
        }

    }
}
 

---------------------------------------------------------------------

POWER BY 315SOFT.COM

TRUFFER.CN

using System;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{/// <summary>/// 用Pollard-Rho算法求合成质数因子/// </summary>public static class Prime_Factorization{/// <summary>/// 随机数发生器/// </summary>private static Random rand = new Random((int)DateTime.Now.Ticks);/// <summary>/// 计算 x 幂取模/// </summary>/// <param name="x"></param>/// <param name="exponent"></param>/// <param name="modulus"></param>/// <returns></returns>private static long ModularPow(long x, int exponent, long modulus){long result = 1;while (exponent > 0){// 如果 y 是奇数!if ((exponent % 2) == 1){result = (result * x) % modulus;}exponent = (exponent >> 1);x = (x * x) % modulus;}return result;}/// <summary>/// 计算 n 的分解质因子(除)算法/// </summary>/// <param name="n"></param>/// <returns></returns>public static long PollardRho(long n){if (n == 1){return n;}// 偶数if ((n % 2) == 0){return 2;}// 设置一个取值范围long x = (long)(rand.Next(0, -(int)n + 1));long y = x;long c = (long)(rand.Next(1, -(int)n));// 初始化候选除数(或结果),直到未获得素数因子。long d = 1L;while (d == 1){x = (ModularPow(x, 2, n) + c + n) % n;y = (ModularPow(y, 2, n) + c + n) % n;y = (ModularPow(y, 2, n) + c + n) % n;d = GCD(Math.Abs(x - y), n);if (d == n){return PollardRho(n);}}return d;}public static long GCD(long a, long b){return ((b == 0) ? a : GCD(b, (a % b)));}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/635702.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11、Kafka ------ Kafka 核心API 及 生产者API 讲解

目录 Kafka核心API 及 生产者API讲解★ Kafka的核心APIKafka包含如下5类核心API&#xff1a; ★ 生产者APIKafka 的API 文档 ★ 使用生产者API发送消息 Kafka核心API 及 生产者API讲解 官方文档 ★ Kafka的核心API Kafka包含如下5类核心API&#xff1a; Producer API&#x…

spring data mongo 在事务中,无法自动创建collection

spring data mongo 在事务中,无法自动创建collection org.springframework.dao.DataIntegrityViolationException: Write operation error on server xxx:30001. Write error: WriteError{code=263, message=Cannot create namespace xxx.xxxin multi-document transaction.…

Ubuntu18.04 gcc找不到

make报错gcc: not found 问题描述 rootubuntu:/#make gcc -I. -I.. -I../include -fPIC -DOPENSSL_PIC -DZLIB_SHARED -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -…

Redis(四)

1、Redis的单/多线程 1.1、单线程 其实直接说Redis什么单线程或者是多线程&#xff0c;不太准确&#xff0c;在redis的4.0版主之前是单线程&#xff0c;然后在之后的版本中redis的渐渐改为多线程。 Redis是单线程主要是指Redis的网络IO和键值对读写是由一个线程来完成的&#…

小白水平理解面试经典题目LeetCode 125 Valid Palindrome(验证回文串)

125 验证回文串 说到公司面试&#xff0c;那就是得考出高度&#xff0c;考出水平&#xff0c;什么兼顾这两者呢&#xff0c;那就得看这道 原题描述&#xff1a; 给定一个字符串&#xff0c;判断它是否是回文串。回文串是指正读和反读都一样的字符串。 输入: “A man, a pla…

超级弱口令检查工具

工具介绍 超级弱口令检查工具是一款Windows平台的弱口令审计工具&#xff0c;支持批量多线程检查&#xff0c;可快速发现弱密码、弱口令账号&#xff0c;密码支持和用户名结合进行检查&#xff0c;大大提高成功率&#xff0c;支持自定义服务端口和字典。 工具采用C#开发&#…

1.19(232.用栈实现队列)

1.19(232.用栈实现队列) 在push数据的时候&#xff0c;只要数据放进输入栈就好&#xff0c;但在pop的时候&#xff0c;操作就复杂一些&#xff0c;输出栈如果为空&#xff0c;就把进栈数据全部导入进来&#xff08;注意是全部导入&#xff09;&#xff0c;再从出栈弹出数据&a…

QList应用大全

一.概述 1.QList介绍&#xff1a; QList将项目存储在一个列表中&#xff0c;该列表提供基于索引的快速访问以及基于索引的插入和删除。QList、QLinkedList 和 QVector 提供了类似的 API 和功能。QList不是指针结构体类型的链表&#xff0c;真正的结构体指针链表是 QLinkedLis…

unity-声音与声效OLD

声音与声效 基本概念audio clipaudio listeneraudio source 基本操作如何创建音频源&#xff08;背景音乐&#xff09;如何在测试的时候关闭声音 常用代码一般流程如何在一个物体上播放多个音效如何在代码中延时播放多个声音如何在代码中停止音频的播放如何判断当前是否在播放音…

福昕软件的使用

快捷操作 快捷键 快捷键功能备注Ctrl P打印 Ctrl W关闭 Ctrl B书签 鼠标放菜单栏&#xff0c;单击右键即可导入/导出 自定义菜单栏文件-->偏好设置-->文档 1、多实例&#xff1a;单击PDF后均重新打开一个新界面。

算法训练 day25 | 216.组合总和III 17.电话号码的字母组合

216.组合总和III 题目链接:组合总和III 视频讲解:和组合问题有啥区别&#xff1f;回溯算法如何剪枝&#xff1f; 本题和77.组合其实是差不多的&#xff0c;只是增加了求和的过程。对于剪枝&#xff0c;也要多加一步判断&#xff0c;当所求得和大于规定的和时应该舍去。其他部…

多账号批量管理—如何解决账号关联和账号封禁?

在当今的数字时代&#xff0c;拥有多个账号已经成为许多人处理个人和商业事务的常见需求。然而&#xff0c;账号关联和账号封禁等问题常常困扰着用户。幸运的是&#xff0c;有一种多账号管理神器可以帮助解决这些问题。在本文中&#xff0c;我们将介绍这个神器如何帮助人们批量…

MySQL中SELECT字句的顺序以及具体使用

目录 1.SELECT字句及其顺序 2.使用方法举例 3.HAVING和WHERE 1.SELECT字句及其顺序 *下表来自于图灵程序设计丛书&#xff0c;数据库系列——《SQL必知必会》 2.使用方法举例 *题目来源于牛客网 题目描述 现在运营想要查看不同大学的用户平均发帖情况&#xff0c;并期望结…

[AI]文心一言出圈的同时,国外的ChatGPT-4.5最新资讯

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…

为了Atcoder系列复习C++语法

很久之前学过忘了 为了打比赛重新复习 每打一次就更一次 含日语内容 B - 1.01.出力とコメント 1.cout << 2525 << endl; 可以没有endl 结尾. endl作用是换行 2.整除问题 int情况下1/2无法变成0.5 所以1/2应该放在后面 100 * (100 1) / 2 3.f…

【Git】 取消上一次commit或push

一、取消上一次commit 如果你需要取消上一次的 Git 提交&#xff0c;有几个不同的方法可以实现。其中包括撤消提交、提交到新的分支、使用 Git 回滚等等。 下面介绍三种方法&#xff1a; 方法1&#xff1a;使用 Git reset 使用 Git reset 命令来取消上一次提交&#xff1a; …

五、模 板

1 泛型编程 以往我们想实现一个通用的交换函数&#xff0c;可能是通过下面的方式来实现的&#xff1a; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right) {double temp left;left ri…

笔记-孙子兵法-第三篇-谋攻(1)-不战而屈人之兵,上兵伐谋,韩信之死

笔记-From 《华杉讲透孙子兵法》和《兵以诈立&#xff0c;我读孙子》 第三篇-谋攻&#xff08;1&#xff09;不战而屈人之兵 《孙子兵法》第一篇讲计&#xff0c;第二篇讲野战&#xff0c;第三篇就讲攻城。 《孙子》尚谋&#xff0c;认为最好是“不战而屈人之兵”&#xff0…

【机器学习】四大类监督学习_模型选择与模型原理和场景应用_第03课

监督学习中模型选择原理及场景应用 监督学习应用场景 文本分类场景&#xff1a; o 邮件过滤&#xff1a;训练模型识别垃圾邮件和非垃圾邮件。 o 情感分析&#xff1a;根据评论或社交媒体内容的情感倾向将其分类为正面、负面或中性评价。 o 新闻分类&#xff1a;将新闻文章自动…

适用于 Windows 11 的 12 个最佳免费 PDF 编辑器

除了绘图等基本功能外&#xff0c;一些适用于 Windows 11 的免费 PDF 编辑器还具有 AI、OCR 识别和书签等高级功能。 我们的列表包含易于立即下载的 PDF 编辑软件工具。 这些工具不仅可以帮助转换 PDF、编辑、上传、删除、裁剪、分割、提取等。 PDF 是指便携式文档格式&…