Python 元组列表的幂和

Python 元组列表的幂和,python,Python,我的任务是创建一个函数来求元组的幂和 def sumOfPowers(tups, primes): x = 0; for i in range (1, len(primes) + 1): x += pow(tups, i); return x; 到目前为止,我有这个 元组-一个或多个元组的列表,素数-一个或多个素数的列表 它不起作用,因为输入是元组而不是单整数。我如何修复此问题以使其适用于列表 [/编辑] 样本输出

我的任务是创建一个函数来求元组的幂和

    def sumOfPowers(tups, primes):
        x = 0;
        for i in range (1, len(primes) + 1):
            x += pow(tups, i);
        return x;
到目前为止,我有这个

元组-一个或多个元组的列表,素数-一个或多个素数的列表

它不起作用,因为输入是元组而不是单整数。我如何修复此问题以使其适用于列表

[/编辑] 样本输出:

sumOfPowers([(2,3), (5,6)], [3,5,7,11,13,17,19,23,29]) == 2**3 + 5**6
True

sumOfPowers([(2,10**1000000 + 1), (-2,10**1000000 + 1), (3,3)], primes)
27
[(2,4),(3,5),(-6,3)]的幂和为2^4+3^5+(−6) ^3

**素数的目的是计算^k1+。。。输入列表中每个素数的^kn模。(aka对第二个输入列表中的每个素数执行每个输入模指定的求和计算,然后使用中国剩余定理进行求解)

示例输入中使用的素数列表:

     15481619,15481633,15481657,15481663,15481727,15481733,15481769,15481787 
    ,15481793,15481801,15481819,15481859,15481871,15481897,15481901,15481933 
    ,15481981,15481993,15481997,15482011,15482023,15482029,15482119,15482123 
    ,15482149,15482153,15482161,15482167,15482177,15482219,15482231,15482263 
    ,15482309,15482323,15482329,15482333,15482347,15482371,15482377,15482387 
    ,15482419,15482431,15482437,15482447,15482449,15482459,15482477,15482479 
    ,15482531,15482567,15482569,15482573,15482581,15482627,15482633,15482639 
    ,15482669,15482681,15482683,15482711,15482729,15482743,15482771,15482773 
    ,15482783,15482807,15482809,15482827,15482851,15482861,15482893,15482911 
    ,15482917,15482923,15482941,15482947,15482977,15482993,15483023,15483029 
    ,15483067,15483077,15483079,15483089,15483101,15483103,15483121,15483151 
    ,15483161,15483211,15483253,15483317,15483331,15483337,15483343,15483359 
    ,15483383,15483409,15483449,15483491,15483493,15483511,15483521,15483553 
    ,15483557,15483571,15483581,15483619,15483631,15483641,15483653,15483659 
    ,15483683,15483697,15483701,15483703,15483707,15483731,15483737,15483749 
    ,15483799,15483817,15483829,15483833,15483857,15483869,15483907,15483971 
    ,15483977,15483983,15483989,15483997,15484033,15484039,15484061,15484087 
    ,15484099,15484123,15484141,15484153,15484187,15484199,15484201,15484211 
    ,15484219,15484223,15484243,15484247,15484279,15484333,15484363,15484387 
    ,15484393,15484409,15484421,15484453,15484457,15484459,15484471,15484489 
    ,15484517,15484519,15484549,15484559,15484591,15484627,15484631,15484643 
    ,15484661,15484697,15484709,15484723,15484769,15484771,15484783,15484817 
    ,15484823,15484873,15484877,15484879,15484901,15484919,15484939,15484951 
    ,15484961,15484999,15485039,15485053,15485059,15485077,15485083,15485143 
    ,15485161,15485179,15485191,15485221,15485243,15485251,15485257,15485273 
    ,15485287,15485291,15485293,15485299,15485311,15485321,15485339,15485341 
    ,15485357,15485363,15485383,15485389,15485401,15485411,15485429,15485441 
    ,15485447,15485471,15485473,15485497,15485537,15485539,15485543,15485549 
    ,15485557,15485567,15485581,15485609,15485611,15485621,15485651,15485653 
    ,15485669,15485677,15485689,15485711,15485737,15485747,15485761,15485773 
    ,15485783,15485801,15485807,15485837,15485843,15485849,15485857,15485863
或简称:

def sumOfPowers (powerPairs, unusedPrimesParameter):
    return sum(base ** exponent for base, exponent in powerPairs)

对第二个输入列表中的每个素数执行每个输入模指定的求和计算

那是完全不同的事情。然而,您仍然没有真正解释函数应该做什么以及它应该如何工作。考虑到你提到了欧拉定理和中国剩余定理,我想这比你让我们相信的要多得多。你可能想通过使用欧拉定理来减少这些大的幂来求解指数。不过,我不愿意进一步猜测到底发生了什么;这似乎涉及到一个非常重要的数学问题,你应该先在纸上解决

def sumOfPowers (powerPairs, primes):
    for prime in primes:
        sum = 0
        for base, exponent in powerPairs:
            sum += pow(base, exponent, prime)

        # do something with the sum here
        # Chinese remainder theorem?
    return something

忽略
素数
,因为它们似乎不用于任何用途:

def sumOfPowers(tups, primes):
    return sum( pow(x,y) for x,y in tups)
有没有可能你要计算一个或多个素数的和模?差不多

2**3 + 5**2 mod 3 = 8 + 25 mod 3 = 33 mod 3 = 0
(其中,
a+b mod c
表示在除以
c
后,取总和
a+b
的剩余部分)


关于如何使用多重素数的一个猜测是使用素数的乘积作为 除数

(我似乎还记得,
a mod pq==(a mod p)mod q
如果
p
q
都是素数,但我可能错了。)


另一种方法是为每个素数返回一个和:

def sumOfPower(tups, primes):
    return [ sum( pow(x,y,c) for x,y in tups ) for c in primes ]

我不太确定我是否正确理解你,但也许你在寻找这样的东西:

from functools import reduce

def sumOfPowersModuloPrimes (tups, primes):
    return [reduce(lambda x, y: (x + y) % p, (pow (b, e, p) for b, e in tups), 0) for p in primes]

您不应该遇到任何内存问题,因为(中间)值永远不会超过
max(primes)
。如果生成的列表太大,则返回一个生成器并使用它,而不是列表。

只是提示-Python不需要分号。元组的幂是什么?您能给我们一些示例输入和预期输出吗?primes列表有什么意义?@user2827356但为什么要将其传递给函数?你该怎么处理它?我在做一些测试时内存不足,有没有办法提高效率?@user2827356你使用的是py2还是py3?Py3对内存友好得多,因为它在py2使用列表的许多地方使用生成器,因此节省了列表的分配成本。此函数使用的唯一实际内存是
sum
;你产生的数字有这么大吗?除非你有非常大的指数,否则这需要很长时间。我用的是p3。我必须修改这个函数,使其能够接受非常大的输入。我不太理解你的问题,但是pow()可以接受第三个参数来进行素数的模运算,这不会耗尽内存。你不是在最后一行缺少一个模吗?比如:
[sum(pow(x,y,c)表示x,y为元组)%c表示c表示素数]
总和可能超过当前素数。遗憾的是,是的。我可以计算整个总和的余数,也可以放弃
sum
,在每次加法后使用循环计算余数。目前还不清楚哪一个更快(保持数字较小而减少分区数),因此需要进行基准测试。OP的测试用例失败。@poke for
sumOfPowers([(2,3),(5,6)],[3,5,7,11,13,17,19,23,29])
它产生
[0,3,2,2,7,10,15,16,2]
。失败在哪里?预期的结果是什么?将结果与[3,5,7,11,13,17,19,23,29]:print((2**3+5**6)%p)中p的
进行比较。该值应神奇地等于
2**3+5**6
。就像另一个调用一样,只生成
27
。我不能告诉你它是怎么做到的。从OP甚至不清楚它是否应该返回27,因为在他的例子中,他完全忽略了素数,但暗示素数应该用于模算术。
def sumOfPower(tups, primes):
    return [ sum( pow(x,y,c) for x,y in tups ) for c in primes ]
from functools import reduce

def sumOfPowersModuloPrimes (tups, primes):
    return [reduce(lambda x, y: (x + y) % p, (pow (b, e, p) for b, e in tups), 0) for p in primes]