【问题描述】
如果有两个正整数a和b,a的所有除本身以外的因数之和等于b,b的所有除本身以外的因数之和等于a,则称a、b是一对相亲数。请输出200000以内的相亲数对。
输出结果:
运行1次getamic_mp函数花费时间:2.1769893169403076秒
[(220,284),(1184,1210),(2620,2924),(5020,5564),(6232,6368),(10744,10856),(12285,14595),(17296,18416),(63020,76084),(66928,66992),(67095,71145),(69615,87633),(79750,88730),(100485,124155),(122265,139815),(122368,123152),(141664,153176),(142310,168730),(171856,176336),(176272,180848)]
备注:该程序运行在双核四线程的计算机上,同一算法采用单进程运算的时间大约是5.4秒。
【题前思考】
根据问题描述,填写表8-2-3。
表8-2-3 问题分析
【解题思路】
项目五中求相亲数的函数依赖于保存约数和的列表,这就意味着在程序执行过程中多个任务要共享这个列表,这就给并行操作带来了障碍。重新设计算法,让判断相亲数的过程不依赖于列表,而是对每个数单独计算,就可以让判断相亲数的操作互不干扰,使之易于多个进程并行执行。
【参考代码】
【代码分析】
①:定义函数amicable(n)求n的相亲数,如果n有相亲数,则返回元组(n,n的相亲数),反之返回none,这样就能分别判断每个数有没有相亲数而不会相互干扰。关于求整数m的约数之和的局部函数sumfactor(m)的更多内容参见项目五。
②:定义函数getamic_mp(a,b)以多进程的方式求a~b的相亲数。
③:创建进程数为cpu_count( )的进程池,命名为p,调用进程池的map( )方法以多进程的方式运行amicable( )函数,每次调用amicable( )函数的参数构成列表又作为参数传递给map( )方法,最后将各次函数调用的结果以列表的形式返回保存到变量res。