关于小于n的亲和数的线性求法,To:v_JULY_v

绿色夹克衫 2011-05-26 09:18:32
Blog实在没法写,还是专门开一个帖子吧!

思路也比较简单

设n = p1^a1 * p2^a2 * .... pn^an(p1-pn为因数分解,a1-an为幂),则n的所有约数和 = (p1^(a1+1) - 1) * (p2^(a2+1) - 1) * .... (pn^(an+1) - 1)/(p1-1)(p2-1).......(pn-1)

比如2*3*5*7的约数和 = 3*4*6*8

设f(n)是n的所有约数的和,有了上面的递推,算90这样的数的约数和时,没有必要把1、2、3、5、6、9、10、15、18、30、45、90都加一遍,f(90) = f(45) * 3,因此把质数的线性筛法改一下,就可以了。

当然很有可能还有更好的方法,如果有构造的可能的话,也许效率会非常高,我就当抛砖引玉了。

using System;
using System.Collections.Generic;

namespace CSharpTest
{
class Program
{
public static void Main()
{
int max = 5000000;
int[] counter = CreateCounter(max);

for (int i = 0; i < counter.Length; i++)
{
int num = counter[i] - i;
if (num < counter.Length && num > i && counter[num] == counter[i])
Console.WriteLine("{0} {1}", i, num);
}

Console.ReadKey();
}

static int[] CreateCounter(int n)
{
List<int> primes = new List<int>();
int[] counter = new int[n + 1];
counter[1] = 1;

for (int i = 2; i <= n; i++)
{
if (counter[i] == 0)
{
counter[i] = i + 1;
primes.Add(i);
}

for (int j = 0; j < primes.Count; j++)
{
if (primes[j] * i > n)
break;

if (i % primes[j] == 0)
{
int k = i;
int l = primes[j] * primes[j];

while (k % primes[j] == 0)
{
l *= primes[j];
k /= primes[j];
}

counter[primes[j] * i] = counter[k] * (l - 1) / (primes[j] - 1);
break;
}
else
counter[primes[j] * i] = counter[i] * (primes[j] + 1);
}
}

return counter;
}
}
}
...全文
1651 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
TKD03072010 2011-05-29
  • 打赏
  • 举报
回复
呵 学习了 ,博客上看了一下,哎 发现自己的差距越来越遥远咯!!!!!
超级大笨狼 2011-05-29
  • 打赏
  • 举报
回复
真因子不是质数吗?4不是质数啊?
超级大笨狼 2011-05-29
  • 打赏
  • 举报
回复
这个东西有什么用途?
pandm 2011-05-27
  • 打赏
  • 举报
回复
表示看不懂。。。路过并膜拜一下大牛们。。。。
q107770540 2011-05-27
  • 打赏
  • 举报
回复
mark一下
  • 打赏
  • 举报
回复
先顶再看,那天看了你说线性复杂度以后,特意去看了线性质数筛法的代码。可是还是没想出来怎么弄。原来是有这个质因子的性质做桥梁,佩服!
孤独小剑 2011-05-27
  • 打赏
  • 举报
回复
这是什么约数和?
绿色夹克衫 2011-05-27
  • 打赏
  • 举报
回复
转一下july的Blog,说明一下题意,怕大家看不明白

亲和数问题最早是由毕达哥拉斯学派发现和研究的。他们在研究数字的规律的时候发现有以下性质特点的两个数:
220的真因子是:1、2、4、5、10、11、20、22、44、55、110;
284的真因子是:1、2、4、71、142。
而这两个数恰恰等于对方的真因子各自加起来的和(sum[i]表示数i 的各个真因子的和),即
220=1+2+4+71+142=sum[284],
284=1+2+4+5+10+11+20+22+44+55+110=sum[220]。
得284的真因子之和sum[284]=220,且220的真因子之和sum[220]=284,即有sum[220]=sum[sum[284]]=284。

现在的目标就是找出500万以内的亲和数。

[Quote=引用 8 楼 pandm 的回复:]
表示看不懂。。。
[/Quote]
绿色夹克衫 2011-05-26
  • 打赏
  • 举报
回复
说速度的话,这个方法未必比n*log(n)的快,一般来讲由于缓存命中的问题,线性筛法的速度比不上那个n*log(log(n))的厄氏筛法。只是算法的复杂度,这种方法会比较低。

[Quote=引用 4 楼 v_july_v 的回复:]
0.484375
0.484375
0.46875

单位second
[/Quote]
v_JULY_v 2011-05-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 v_july_v 的回复:]
引用楼主 litaoye 的回复:
Blog实在没法写,还是专门开一个帖子吧!

思路也比较简单

设n = p1^a1 * p2^a2 * .... pn^an(p1-pn为因数分解,a1-an为幂),则n的所有约数和 = (p1^(a1+1) - 1) * (p2^(a2+1) - 1) * .... (pn^(an+1) - 1)/(p1-1)(p2-1).......(pn-1)……
[/Quote]

#include "time.h"
#include "stdio.h"
#include "stdlib.h"
time_t c_start,t_start, c_end,t_end;
c_start = clock();
c_end = clock();
printf("The program used %f ms by time().\n",difftime(c_end,c_start)) ;
v_JULY_v 2011-05-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 litaoye 的回复:]
Blog实在没法写,还是专门开一个帖子吧!

思路也比较简单

设n = p1^a1 * p2^a2 * .... pn^an(p1-pn为因数分解,a1-an为幂),则n的所有约数和 = (p1^(a1+1) - 1) * (p2^(a2+1) - 1) * .... (pn^(an+1) - 1)/(p1-1)(p2-1).......(pn-1)

比如2*3*5*7的约数和 =……
[/Quote]

public static void Main()
{
int max = 5000000;
DateTime start = DateTime.Now;
int[] counter = CreateCounter(max);

for (int i = 0; i < counter.Length; i++)
{
int num = counter[i] - i;
//if (num < counter.Length && num > i && counter[num] == counter[i])
// Console.WriteLine("{0} {1}", i, num);
}
Console.WriteLine((DateTime.Now - start).TotalSeconds);

Console.ReadKey();
}



0.484375
0.484375
0.46875

单位second
liuzhengxi2010 2011-05-26
  • 打赏
  • 举报
回复
学习学习
KeyCw88 2011-05-26
  • 打赏
  • 举报
回复
接分,学习~
v_JULY_v 2011-05-26
  • 打赏
  • 举报
回复
请特别注意本课程的最后更新时间与当前考试版本是否一致!!!!2021年3月最后更新,当前K8S考试版本为 v1.20 5天上机实操培训 + 1天考前辅导:模块课程内容Container与Kubernetes概述√    容器的概述√  容器与虚拟化的关系√  容器与Docker关系√  容器技术的发展历程√  容器编排技术概述√  Kubernetes概述√  Container和Kubernetes的关系Docker的安装和管理√  Docker安装√  Docker基础操作√  docker存储机制√  构建docker网络√  Namespace和Cgroup√  容器资源限制实战:√  为企业部署Docker√  秒级搭建HTTP服务√  实现容器的持久化存储Kubernetes架构介绍√  Kubernetes架构√  主要组件介绍√  基本概念与术语√  Kubernetes管理对象Kubernetes 安装和配置√  设计Kubernetes集群√  基于centos平台的安装配置√  安装Kubernetes   Masters和Nodes√  安装并使用kubeadm来安装,配置和管理Kubernetes集群√  选择网络解决方案√  部署后的测试实战:√  为企业构建Kubernetes集群Kubernetes API   及集群访问√  Yaml文件对API资源结构的定义√  使用Kubectl对API资源做访问√  NameSpaces介绍√  NameSpace管理实战:√  编写yaml文件√  构建Kubernetes的命名空间Pod管理与使用√  Pod介绍与原理讲解√  Pod创建与删除√  Pod生命周期管理√  Static Pods√  Init Containers实战:√  创建多容器的pod√  pod生命周期管理√  设置POD中容器的启动顺序Label与Label   Selector√  标签(Label)√  标签选择器(Label Selector)√  使用标签选择器来安排Pod√  使用标签选择器来管理Node实战:√  让Pod运行到指定的节点√  批量管理指定标签的PodKubernetes常用的控制器√  ReplicaSet√  Deployment√  DaemonSet√  Job√  CronJob√  Statefulset实战:√  在每一个节点部署nginx服务√  实现nginx服务的弹性伸缩√  快速实现企业nginx服务的滚动升级√  创建一次性和周期性任务Kubernetes网络及服务√  Kubernetes网络模型√  Pod网络实现方式√  Calico 网络插件及部署√  Service的作用√  通过服务发现的服务访问流程实战:√  实现POD与POD通信√  实现POD与NODE通信√  实现nginx和http服务外部访问Kubernetes 负载均衡√  IPTABLES模式实现原理√  IPVS模式实现原理√  Ingress的原理讲解和使用实战:√  实现HTTP的负载均衡√  创建IngressKubernetes存储√  EmptyDir√  hostPath√  NFS√  PV和PVC√  StorageClass√  ConfigMap介绍√  Secret介绍实战:√  实现POD间的共享存储√  向POD中分发机密信息√  创建使用StorageClassKubernetes资源调度√  Kubernetes资源管理√  Kubernetes调度器√  Kubernetes调度策略√  Kubernetes调度优先级和抢占机制√  Node策略和pod策略√  Taints和Toleration实战:√  为企业设置POD亲和性√  设置Kubernetes调度优先级√  将服务器设置为污点Kubernetes 安全√  访问API√  身份的验证与授权√  基于角色访问权限配置√  网络安全策略配置实战:√  为企业创建Kubernetes帐号√  设置帐号的权限√  验证权限√    配置Network Policy日志、监控、Troubleshooting和维护√  Kubernetes的日志方案√  Troubleshooting的方法论√  常见的场景排错√  维护模式(Cordon)√  疏散POD(Drain)实战:√  排查Kubernetes常见故障√  设置维护模式Helm包管理工具√  Helm简介√  使用Helm√  Chart简介√  Chart模板的使用实战:√  通过helm为企业部署Web√  通过helm构建WordPress博客平台√  使用Helm实现企业应用的升级与回滚 考前辅导:√  考试卷购买√  考试预约流程√  考试环境介绍√  考前辅导,真题讲解

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧