Newcoder 145 D.Inverse Inverse Problem(数论)

本文探讨了模运算中特定形式的多项式f(X)=AX+B的N次迭代的求解与逆问题,通过矩阵快速幂的方法推导出求解步骤,并给出了相应的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

原始问题:给出 A , B , X , N A,B,X,N A,B,X,N和一个素数 P P P,令 f ( X ) = A X + B f(X)=AX+B f(X)=AX+B,计算 f N ( X )   m o d   P f^N(X)\ mod\ P fN(X) mod P

逆问题:给出 X , N , T X,N,T X,N,T和一个素数 P P P,找非负整数 A , B A,B A,B使得 1 ≤ A ≤ p − 1 , 0 ≤ B ≤ p − 1 1\le A\le p-1,0\le B\le p-1 1Ap1,0Bp1使得 f ( X ) N   m o d   P = T f(X)^N\ mod\ P=T f(X)N mod P=T

逆问题的逆问题:给出一整数 M M M,找 X , N , T , P X,N,T,P X,N,T,P满足 1 ≤ X ≤ 1 0 9 , 1 ≤ N ≤ 1 0 18 , 0 ≤ T &lt; P ≤ M 1\le X\le 10^9,1\le N\le 10^{18},0\le T&lt;P\le M 1X109,1N1018,0T<PM g ( X , N , T , P ) g(X,N,T,P) g(X,N,T,P)最大,其中 g ( X , N , T , P ) g(X,N,T,P) g(X,N,T,P) A A A的最小值使得其满足:存在 B B B使得 1 ≤ A ≤ p − 1 , 0 ≤ B ≤ p − 1 1\le A\le p-1,0\le B\le p-1 1Ap1,0Bp1使得 f ( X ) N   m o d   P = T f(X)^N\ mod\ P=T f(X)N mod P=T,如果无解则 g ( X , N , T , P ) = − 1 g(X,N,T,P)=-1 g(X,N,T,P)=1.

Input

一个整数 M ( 3 ≤ M ≤ 1 0 5 ) M(3\le M\le 10^5) M(3M105)

Output

输出四个整数 X , N , T , P X,N,T,P X,N,T,P

Sample Input

8

Sample Output

2018 231 1 7

Solution

首先考虑已知 A , B , X , P , N A,B,X,P,N A,B,X,P,N T T T的值,由矩阵快速幂可知 T = f N ( X ) = ( A N X + ( 1 + A + . . . + A N − 1 ) B ) % P T=f^N(X)=(A^NX+(1+A+...+A^{N-1})B)\% P T=fN(X)=(ANX+(1+A+...+AN1)B)%P

假设 A &gt; 1 A&gt;1 A>1,此时即判断 T − A N X ≡ A N − 1 A − 1 B   m o d   P T-A^NX\equiv \frac{A^N-1}{A-1}B\ mod\ P TANXA1AN1B mod P是否有解,不妨令 T = 1 , X = P T=1,X=P T=1,X=P,那么只要 A N − 1 ̸ ≡ 0   m o d   P A^N-1\not \equiv 0\ mod\ P AN1̸0 mod P B B B有解,显然可以取 A = 2 , N = 5 , P = 3 A=2,N=5,P=3 A=2,N=5,P=3使得该同余不等式成立,故该方程一定有 A &gt; 1 A&gt;1 A>1的解

为使 A A A最大,我们有 x N ≡ 1   m o d   P , 2 ≤ x &lt; A x^N\equiv 1\ mod\ P,2\le x&lt;A xN1 mod P,2x<A A N ̸ ≡ 1   m o d   P A^N\not\equiv 1\ mod\ P AN̸1 mod P,满足前一个条件只需取 N = l c m ( r ( 2 ) , . . . , r ( A − 1 ) ) N=lcm(r(2),...,r(A-1)) N=lcm(r(2),...,r(A1))即可,其中 r ( x ) r(x) r(x)为使得 x g ≡ 1   m o d   P x^g\equiv 1\ mod\ P xg1 mod P的最小正整数 g g g,满足第二个条件只需让 ( P − 1 ) ̸ ∣ N (P-1)\not|N (P1)̸N即可,故直接枚举 P P P A A A即可,注意若 N &lt; P N&lt;P N<P N N N乘上 P P P即可,因为 ( P , P − 1 ) = 1 (P,P-1)=1 (P,P1)=1

Code

#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
#define maxn 100005
vector<int>f[maxn],prime;
bool mark[maxn];
void init(int n=1e5)
{
	for(int i=2;i<=n;i++)
		if(!mark[i])
		{
			prime.push_back(i);
			for(int j=2*i;j<=n;j+=i)mark[j]=1;
		}
	for(int i=1;i<=n;i++)
		for(int j=i;j<=n;j+=i)
			f[j].push_back(i);
}
int mul(int a,int b,int c)
{
	ll z=1ll*a*b;
	return z-z/c*c;
}
int Pow(int a,int b,int c)
{
	int ans=1;
	while(b)
	{
		if(b&1)ans=mul(ans,a,c);
		a=mul(a,a,c);
		b>>=1;
	}
	return ans;
}
ll gcd(ll a,ll b)
{
	return b?gcd(b,a%b):a;
}
ll lcm(ll a,ll b)
{
	return a/gcd(a,b)*b;
}
ll res[maxn];
int main()
{
	init();
	int m;
	scanf("%d",&m);
	int ma=0,ansp;
	for(int i=0;i<prime.size()&&prime[i]<=m;i++)
	{
		int p=prime[i];
		ll lc=1;
		res[p]=lc; 
		for(int r=2;r<p;r++)
		{
			int ans=p-1;
			for(int j=0;j<f[p-1].size();j++)
				if(Pow(r,f[p-1][j],p)==1)
				{
					ans=f[p-1][j];
					break;
				}
			lc=lcm(lc,ans);
			if(lc%(p-1)==0)
			{
				if(r>ma)ma=r,ansp=p;
				break;
			}
			else res[p]=lc;
		}
	}
	if(res[ansp]<ansp)res[ansp]*=ansp; 
	printf("%d %lld 1 %d\n",ansp,res[ansp],ansp);
	return 0;
}

内容概要:本文详细介绍了使用COMSOL进行三相电力变压器温度场与流体场耦合计算的具体步骤和技术要点。首先讨论了变压器温升问题的重要性和现有仿真与实测数据之间的偏差,接着阐述了电磁-热-流三场耦合建模的难点及其解决方法。文中提供了关键的材料属性设置代码,如变压器油的密度和粘度随温度变化的关系表达式,并强调了网格划分、求解器配置以及后处理阶段需要注意的技术细节。此外,还分享了一些实用的经验和技巧,例如采用分离式步进求解策略、优化网格划分方式等,确保模型能够顺利收敛并获得精确的结果。最后,作者推荐了几种常用的湍流模型,并给出了具体的参数设置建议。 适用人群:从事电力系统设计、变压器制造及相关领域的工程师和技术人员,特别是那些希望深入了解COMSOL软件在复杂多物理场耦合计算方面应用的人群。 使用场景及目标:适用于需要对变压器内部温度分布和油流情况进行精确模拟的研究或工程项目。主要目的是提高仿真精度,使仿真结果更加贴近实际情况,从而指导产品设计和优化运行参数。 其他说明:文中不仅包含了详细的理论解释和技术指导,还提供了一些实际案例供读者参考。对于初学者来说,可以从简单的单相变压器开始练习,逐步掌握复杂的三相变压器建模技能。同时,作者提醒读者要注意单位的一致性和材料属性的准确性,这是避免许多常见错误的关键所在。
<think>好的,我现在需要回答用户关于PyTorch中的`torch.inverse`函数是否能够转换为TensorRT算子的问题。首先,我需要了解`torch.inverse`的作用以及TensorRT的支持情况。 根据用户提供的引用资料,特别是引用[1]中提到的问题,用户可能在模型转换过程中遇到兼容性问题,比如RoIAlign算子的差异导致loss不收敛。这说明不同框架间的算子实现可能存在差异,影响模型转换后的表现。因此,`torch.inverse`的兼容性需要进一步确认。 接下来,我应该查阅TensorRT的官方文档,了解其支持的算子列表。TensorRT通常支持常见的矩阵运算,如矩阵乘法、转置等,但逆矩阵计算可能属于更复杂的线性代数操作,可能不在默认支持范围内。此外,还需要考虑不同版本的TensorRT是否有新增支持。 然后,考虑转换过程中可能的替代方案。如果TensorRT不支持`torch.inverse`,用户可能需要自定义插件或者使用其他方法绕过。例如,在模型设计时避免使用逆运算,或者将逆矩阵计算移至CPU处理,再传回GPU。不过这样可能会影响性能。 另外,用户可能需要使用ONNX作为中间格式进行转换。检查PyTorch导出ONNX时`torch.inverse`是否被正确支持,以及TensorRT的ONNX解析器是否能处理该节点。如果ONNX中有对应的逆算子,并且TensorRT支持,那么转换是可行的。 最后,结合引用[3]中提到的其他资源,如rlpyt和OpenAI的baselines,虽然这些是强化学习的库,但也可能涉及矩阵运算,但可能与当前问题关联不大。因此,重点应放在TensorRT本身的文档和社区经验上。 总结,用户的问题需要分步骤验证:检查TensorRT版本的支持情况,尝试导出ONNX模型查看是否包含正确的逆算子节点,以及考虑替代方案或自定义插件。同时,提醒用户注意数值稳定性和性能影响。</think>在PyTorch中,`torch.inverse`函数用于计算矩阵的逆矩阵,但将其转换为TensorRT算子时需注意兼容性和实现细节。以下是分步分析: ### 1. **TensorRT对矩阵逆运算的支持** - **原生支持情况**:截至TensorRT 8.x版本,官方未直接提供`INVERSE`算子。矩阵逆运算需通过自定义插件或组合现有算子实现[^1]。 - **替代方案**:若模型依赖逆矩阵计算,可通过以下方法解决: - **自定义插件**:实现CUDA核函数并注册为TensorRT插件。 - **分解运算**:利用矩阵分解(如LU分解)结合现有算子(矩阵乘法和置换)模拟逆运算。 ### 2. **通过ONNX中间格式转换** - **导出为ONNX**:PyTorch的`torch.onnx.export`会将`torch.inverse`映射为ONNX的`Inverse`算子。 ```python import torch x = torch.randn(3, 3) torch.onnx.export(torch.inverse, x, "inverse.onnx") ``` - **TensorRT的ONNX解析器**:需确认TensorRT版本是否支持`Inverse`节点。若不支持,需通过`onnx-graphsurgeon`修改计算图,替换为自定义插件。 ### 3. **验证与调试** - **数值一致性**:对比PyTorch与TensorRT推理结果,确保逆矩阵计算误差在可接受范围内。 ```python # PyTorch结果 pt_inv = torch.inverse(x) # TensorRT结果 trt_inv = infer_with_trt("inverse.engine", x.numpy()) print("Max Error:", np.max(np.abs(pt_inv.numpy() - trt_inv))) ``` - **性能影响**:矩阵逆运算复杂度为$O(n^3)$,可能成为推理瓶颈,需评估是否必要。 ### 4. **实际应用建议** - **预处理替代**:若矩阵固定,可离线计算逆矩阵并硬编码到模型中。 - **框架限制**:对于动态输入,优先考虑模型结构调整,避免依赖实时逆运算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值