CGAL 5.6.1 - Modular Arithmetic(模板化算法)

1 导言

模块化运算是现代代数系统的基本工具。结合中国余数定理,它是计算 gcd、结果等算法的主力。此外,它还可以作为一种非常有效的过滤器,因为通常只需计算一个素数的模数对应值,就可以排除某个值为零的可能性。

2 留数和模板化

先,本软件包引入了一个 Residue 类型。质数 p 保存在一个静态成员变量中。该类提供静态成员函数来更改该值。

改变质数会使已存在的该类型对象失效。但是,已经存在的对象不会失去其相对于旧质数的价值,并且在恢复旧质数后可以重新使用。由于该类型是基于双运算的,因此质数的值只能小于 226。p 的初始值为 67108859。

此外,软件包还引入了可模块化概念。如果存在从 T 到基于残差类型的代数结构的映射,那么代数结构 T 就被认为是可模块化的。对于标量类型(如整数),这种映射只是进入由 Residue 表示的 Z/pZ 的典型同态映射。对于复合类型(如多项式),该映射适用于复合类型的系数。该映射由类 Modular_traits<T> 提供。Modular_traits<T> 类的设计使 Modularizable 概念可被视为可选概念,也就是说,Modular_traits<T> 提供了一个可用于调度的标记。

2.1 示例

在下面的例子中,为了避免对多项式进行不必要的 gcd 计算,使用了模块化算术作为过滤器。在欧几里得算法中,由于系数的增长,gcd 计算的成本会非常高。

一般的思路是,首先只计算一个素数的 gcd。如果这个模块 gcd 是常数,我们(在大多数情况下)就可以得出结论,实际的 gcd 也是常数。

为此,示例引入了函数 may_have_common_factor()。请注意,这个函数有两个版本,分别适用于系数类型可模块化和不可模块化的情况。如果类型不可模块化,则不应用过滤器,函数返回 true。

需要进一步注意的是,类 Residue 的实现要求尾数精度符合 IEEE 浮点运算标准(IEEE 754)。然而,在某些处理器上,传统 FPU 使用的是扩展精度。因此,在执行任何算术运算之前,必须执行适当的尾数长度。此外,数字必须四舍五入到最接近的数值。可以使用带有 CGAL_FE_TONEAREST 的 Protect_FPU_rounding 来确保这一点,它的副作用还包括强制执行所需的精度。

File ​​​​​​Modular_arithmetic/modular_filter.cpp

#include <CGAL/config.h>
#include <iostream>
#ifdef CGAL_USE_GMP
#include <CGAL/Gmpz.h>
#include <CGAL/Polynomial.h>
// Function in case  Polynomial is Modularizable
template< typename Polynomial >
bool may_have_common_factor(const Polynomial& p1, const Polynomial& p2, CGAL::Tag_true){std::cout<< "The type is modularizable" << std::endl;// Enforce IEEE double precision and rounding mode to nearest// before using modular arithmeticCGAL::Protect_FPU_rounding<true> pfr(CGAL_FE_TONEAREST);// Use Modular_traits to convert to polynomials with modular coefficientstypedef CGAL::Modular_traits<Polynomial> MT;typedef typename MT::Residue_type MPolynomial;typedef typename MT::Modular_image Modular_image;MPolynomial mp1 = Modular_image()(p1);MPolynomial mp2 = Modular_image()(p2);// check for unlucky primes, the polynomials should not lose a degreetypename CGAL::Polynomial_traits_d<Polynomial>::Degree  degree;typename CGAL::Polynomial_traits_d<MPolynomial>::Degree mdegree;if ( degree(p1) != mdegree(mp1)) return true;if ( degree(p2) != mdegree(mp2)) return true;// compute gcd for modular imagesMPolynomial mg  = CGAL::gcd(mp1,mp2);// if the modular gcd is not trivial: return trueif ( mdegree(mg) > 0 ){std::cout << "The gcd may be non trivial" << std::endl;return true;}else{std::cout << "The gcd is trivial" << std::endl;return false;}
}
// This function returns true, since the filter is not applicable
template< typename Polynomial >
bool may_have_common_factor(const Polynomial&, const Polynomial&, CGAL::Tag_false){std::cout<< "The type is not modularizable" << std::endl;return true;
}
template< typename Polynomial >
Polynomial modular_filtered_gcd(const Polynomial& p1, const Polynomial& p2){typedef CGAL::Modular_traits<Polynomial> MT;typedef typename MT::Is_modularizable Is_modularizable;// Try to avoid actual gcd computationif (may_have_common_factor(p1,p2, Is_modularizable())){// Compute gcd, since the filter indicates a common factorreturn CGAL::gcd(p1,p2);}else{typename CGAL::Polynomial_traits_d<Polynomial>::Univariate_content  content;typename CGAL::Polynomial_traits_d<Polynomial>::Construct_polynomial construct;return construct(CGAL::gcd(content(p1),content(p2))); // return trivial gcd}
}
int main(){CGAL::IO::set_pretty_mode(std::cout);typedef CGAL::Gmpz NT;typedef CGAL::Polynomial<NT> Poly;CGAL::Polynomial_traits_d<Poly>::Construct_polynomial construct;Poly  f1=construct(NT(2), NT(6), NT(4));Poly  f2=construct(NT(12), NT(4), NT(8));Poly  f3=construct(NT(3), NT(4));std::cout << "f1        : " << f1 << std::endl;std::cout << "f2        : " << f2 << std::endl;std::cout << "compute modular filtered gcd(f1,f2): " << std::endl;Poly g1 = modular_filtered_gcd(f1,f2);std::cout << "gcd(f1,f2): " << g1 << std::endl;std::cout << std::endl;Poly p1 = f1*f3;Poly p2 = f2*f3;std::cout << "f3        : " << f3 << std::endl;std::cout << "p1=f1*f3  : " << p1 << std::endl;std::cout << "p2=f2*f3  : " << p2 << std::endl;std::cout << "compute modular filtered gcd(p1,p2): " << std::endl;Poly g2 = modular_filtered_gcd(p1,p2);std::cout << "gcd(p1,p2): " << g2 << std::endl;
}
#else
int main (){std::cout << " This example needs GMP! " << std::endl;
}
#endif
 3 历史

Residue 类基于 Sylvain Pion 等人在 [2] 中提出的 C 代码。

软件包的其余部分是将 Exacus [1] 的 NumeriX 库与 CGAL 整合的结果。

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

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

相关文章

Go编译报错 link: running gcc failed: exit status 1(已解决)

背景 在对一个开源的Go程序二次开发 重新编译时 &#xff0c; 报错截图如下 报错文字如下&#xff1a;关键信息 link: running gcc failed: exit status 1 $ go build -o orchestrator-didi -i go/cmd/orchestrator/main.go go build: -i flag is deprecated # command-li…

一文搞懂Vue按钮权限

在编写Vue代码的时候&#xff0c;经常会碰到各种权限问题&#xff0c;如&#xff1a;登录权限、路由权限、按钮权限等。今天我们就好好来说一说这个按钮权限到底是怎么一回事。 文章目录 一、概念二、按钮权限的方式2.1 自定义指定2.2 v-if2.3 函数式渲染2.4 小结 三、总结 一、…

如何系统的学习Python——封装

在Python中&#xff0c;封装是一种面向对象编程的概念&#xff0c;通过将类的内部数据和方法隐藏起来&#xff0c;限制外部对其直接访问。 在Python中&#xff0c;封装可以通过以下方式实现&#xff1a; 1. 私有成员&#xff1a; 在Python中&#xff0c;可以通过在属性或方法…

客服提效工具:一键回复,效率翻倍

在快节奏的工作环境中&#xff0c;每一秒都是宝贵的。对于客服人员来说&#xff0c;每天面对的是海量的咨询和回复&#xff0c;如何在保证服务质量的同时&#xff0c;提高工作效率&#xff1f;最近&#xff0c;我被同事安利了一个神奇的工具——客服宝聊天助手。这是一款专为客…

基于单片机的天然气泄漏报警系统设计论文

目 录 摘 要 I Abstract II 1 引 言 1 2天然气泄露检测报警系统的方案设计 4 2.1 方案选择 4 2.2 天然气泄露报警系统的整体设计方案 5 2.2.1天然气泄漏报警器工作原理 5 2.2.2天然气泄漏报警器的结构 5 3天然气泄露报警的硬件部分设计 7 3.1 STC89C52单片机 7 3.2 传感器的选…

IJCAI23 - Continual Learning Tutorial

前言 如果你对这篇文章感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 本篇 Tutorial 主要介绍了 CL 中的一些基本概念以及一些过往的方法。 Problem Definition Continual Learning 和 Increm…

【MOMO_Tips】批量将word转换为PDF格式

批量将word转换为PDF格式 1.打开文件–>选项–>自定义功能区–>开发工具–>确定 2.点开开发工具&#xff0c;选择第一个visual basic 3.进入页面后找到插入–>模块&#xff0c;就可以看到这样的画面之后将下列vba代码复制粘贴到模块中 Sub ConvertWordsToPd…

进程的内存布局与进程的虚拟地址空间

进程的内存布局 历史沿袭至今&#xff0c;C 语言程序一直都是由以下几部分组成的&#xff1a; ⚫ 正文段。也可称为代码段&#xff0c;这是 CPU 执行的机器语言指令部分&#xff0c;文本段具有只读属性&#xff0c;以防止程序由于意外而修改其指令&#xff1b;正文段是可以共…

精读《React Conf 2019 - Day1》

1 引言 React Conf 2019 在今年 10 月份举办&#xff0c;内容质量还是一如既往的高&#xff0c;如果想进一步学习前端或者 React&#xff0c;这个大会一定不能错过。 希望前端精读成为你学习成长路上的布道者&#xff0c;所以本期精读就介绍 React Conf 2019 - Day1 的相关内…

【报错-大数据技术-Hbase Ranger】hbase创建、删除(表、命名空间)无权限问题,但是向表put、get、scan数据报错

1、问题描述 使用hbase shell执行创建命名空间、创建表、插入数据、获取数据、查看数据、删除命名空间、删除表等命令操作,发现可以创建命名空间、创建表、删除命名空间、删除表,但是插入数据、获取数据、查看数据等操作却报没有权限的问题,但是我已在Ranger上赋予用户test…

2024主流测试工具测评,总有一款适合你!

大家好&#xff01;我是测试元宝~ 在软件开发周期中&#xff0c;测试是确保产品质量的关键环节。随着企业对于软件质量的要求日益提升&#xff0c;测试人员面临着前所未有的挑战&#xff0c;“工欲善其事必先利其器”&#xff0c;选择一款高效、实用的软件测试工具&#xff0c…

LeetCode # 547. 省份数量

547. 省份数量 题目 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a 与城市 c 间接相连。 省份 是一组直接或间接相连的城市&#xff0c;组内不含其他没有…

Git 基于ED25519、RSA算法生成 SSH 密钥

Git 基于ED25519、RSA算法生成 SSH 密钥 基于ED25519算法&#xff0c;生成密钥对命令如下&#xff1a; ssh-keygen -t ed25519 -C "邮箱地址"基于RSA算法&#xff0c;生成密钥对命令如下&#xff1a; ssh-keygen -t rsa -C "<注释内容>"基于ED255…

若依集成MybatisPlus步骤

目录 一、新建业务模块二、集成MybatisPlus三、测试 一、新建业务模块 新建Maven模块&#xff0c;并建立如下目录 新模块的pom.xml添加如下内容 <description>业务模块</description><dependencies><!-- Mysql驱动包 --><dependency><groupI…

我的第一个python web 网站

# -*- coding: utf-8 -*-import http.server import socketserver from datetime import datetimePORT 8000import sys# ...class MyHandler(http.server.SimpleHTTPRequestHandler):def do_GET(self):if self.path /:# 如果路径是根路径&#xff0c;返回页面内容self.send_r…

100个Linux操作命令和20个常用脚本

1.100个Linux操作命令 cd - 切换目录:cd /home/userls - 列出目录内容:ls -lmkdir - 创建目录:mkdir new_folderrmdir - 删除空目录:rmdir empty_foldercp - 复制文件或目录:cp source.txt destination.txtmv - 移动或重命名文件或目录:mv old.txt new.txtrm - 删除文件或…

Locust中wait_time中匿名函数使用方法浅析

前言 翻出之前做个压测项&#xff0c;看到locust中对等待时间的实现方式感到好奇&#xff0c;于是总结下来。 源代码实现 def between(min_wait, max_wait):"""Returns a function that will return a random number between min_wait and max_wait.Example:…

thinkphp学习12-数据库的时间查询

传统方式 可以使用>、<、>、<来筛选匹配时间的数据&#xff1b; public function index() {$res Db::name(user)->where(create_time, >, 2018-1-1)->select();dump($res); }可以使用 between 关键字来设置时间的区间&#xff1b; public function in…

如何在Linux系统部署MeterSphere服务并配置固定公网访问地址

文章目录 推荐 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#…

pgrouting学习记录

1 数据库尝试 路径规划的算法 pgr_dijkstra,pgr_astar, pgr_ksp,pgr_withpoints_参考1,pgr_withpoints_参考2 其中pgr_ksp 是dijkstra算法和yen算法结合,获取两点之间的k条最短路径 pgr_dijkstra 算法SELECT gid, geom, node, cost, source, target, ST_Reverse(geom) AS fl…