亲和数尝试一二

最近看数学家故事,竟然看到费马其中一个贡献是找到了第二对亲和数。 其实蛮厉害的,在没有强大计算机能力的年代,凭计算能找出另一对。

出于对他们的尊重,我也尝试用程序写个,看能计算出多少。以下是简单的程序:

def middle(num):
    '''
    取'中位数'
    :param num:
    :return:
    '''
    if num % 2 == 0:
        return (num-2) // 2
    else:
        return (num-1) // 2


def cal_divisor(num):
    '''
    计算约数
    :param num:
    :return:
    '''
    mid_num = middle(num)
    res = []
    for i in range(1, mid_num+1):
        if num % i == 0 and i not in res:
            res.append(i)
            res.append(num//i)

    return res


def cal_amicable_numbers(n):
    '''
    计算亲和数
    :param n:
    :return:
    '''
    res = {}
    for key in range(4, n+1):
        res_list = cal_divisor(key)
        if res_list and len(res_list) > 2:
            res_list.remove(max(res_list))
            amicable_number_sum = sum(res_list)
            if amicable_number_sum in res and res.get(amicable_number_sum) == key:
                print("amicable_numbers:%s and %d" % (amicable_number_sum, key))
            else:
                res.update({key: amicable_number_sum})


cal_amicable_numbers(500000000)

结果到后面真的很慢很慢,需要对这些数据竟然研究,观察,以下是部分这些数据,程序跑了几个小时,依旧没有结束

amicable_numbers:220 and 284
amicable_numbers:1184 and 1210
amicable_numbers:2620 and 2924
amicable_numbers:5020 and 5564
amicable_numbers:6232 and 6368
amicable_numbers:10744 and 10856
amicable_numbers:12285 and 14595
amicable_numbers:17296 and 18416
amicable_numbers:66928 and 66992
amicable_numbers:67095 and 71145
amicable_numbers:63020 and 76084
amicable_numbers:69615 and 87633
amicable_numbers:79750 and 88730
amicable_numbers:122368 and 123152
amicable_numbers:100485 and 124155
amicable_numbers:122265 and 139815
amicable_numbers:141664 and 153176
amicable_numbers:142310 and 168730
amicable_numbers:171856 and 176336
amicable_numbers:176272 and 180848
amicable_numbers:196724 and 202444
amicable_numbers:185368 and 203432
amicable_numbers:280540 and 365084
amicable_numbers:308620 and 389924
amicable_numbers:356408 and 399592
amicable_numbers:319550 and 430402
amicable_numbers:437456 and 455344
amicable_numbers:469028 and 486178
amicable_numbers:503056 and 514736
amicable_numbers:522405 and 525915
amicable_numbers:643336 and 652664
amicable_numbers:600392 and 669688
amicable_numbers:609928 and 686072
amicable_numbers:624184 and 691256
amicable_numbers:635624 and 712216
amicable_numbers:667964 and 783556
amicable_numbers:726104 and 796696

你可能感兴趣的:(亲和数尝试一二)