【问题标题】:Formula for division of each individual term in a summation求和中每个单独项的除法公式
【发布时间】:2012-05-05 04:55:14
【问题描述】:

示例:

当整体应用除法时,结果是,

求和公式由下式给出,

使用求和规则可以在 O(1) 中轻松计算上述内容。

但是当它单独应用于每个术语时(在商中的小数点后截断), =0+1+1+2+3+3+4+5=19。 [在C中使用普通int/int除法]

上述方法需要O(N),因为无法应用求和规则。

我理解以上是由于除法应用于每个术语而不是最后一个术语时,精度损失更多。但这正是我所需要的。[在上面的例子中, 19 是必需的解决方案,而不是 21]

是否有一个公式可以作为将除法单独应用于每个术语的快捷方式,类似于求和?

【问题讨论】:

  • 求和总是Σ(i=1..n; (2i-1)/3) 的形式吗?如果没有,那么你会意识到答案是“不”。此外,这不是由于精度损失(例如浮点运算);这就是整数除法的定义。
  • @outis: 是的,它总是那种形式。
  • 为了清楚起见,您实际上想要“失去准确性”,并且想要计算 (int)1/3 + (int)3/3 + (int)5/3 ...,正确的?纯粹出于好奇,我很想知道这个问题是在什么背景下出现的。

标签: c math complexity-theory


【解决方案1】:

所以,你得到:

0 + (1+1+2) + (3+3+4) + 5

让我们乘以 3:

0 + (3+3+6) + (9+9+12) + 15

并将其与 (1+...+15)/3 的分子进行比较:

1 + (3+5+7) + (9+11+13) + 15

您可以清楚地看到,您所求的总和平均每 3 项中的分子损失 3 项,或者平均每项损失 1 项。我们如何将术语分组为三元组并不重要:

(0+3+3) + (6+9+9) + 12+15
(1+3+5) + (7+9+11) + 13+15

甚至

0+3 + (3+6+9) + (9+12+15)
1+3 + (5+7+9) + (11+13+15)

所以你的 sum*3 比 (1+...+15)/3 的分子少大约项数。

分子可以使用等差数列之和的公式计算:n2,其中n是和中的项数:

1+3+5+7+9+11+13+15 = 28 = 64

现在你从 64 中减去 8,得到 56,然后除以 3,得到 18.6(6)。该数字不等于 19,因为 n(术语数)不是 3 的倍数。

因此,最终公式不完全是 (n2-n)/3,但与正确公式的值最多相差 1。

其实是:

(n*n-n+1)/3 向下舍入或使用整数除法计算。

将我们得到的数字插入其中:

(8*8-8+1)/3 = 57/3 = 19

【讨论】:

  • 抱歉,如果我的问题不清楚,我对每个单独的术语使用 C 的整数(int/int)除法,因为我不关心精度。
  • 我仍然不确定您需要什么以及为什么。但是,在以 3 为底的定点或浮点算术中,您可以将 1 到 15 的每个奇数除以 3,而不会丢失任何舍入结果,然后您可以将分数相加并得到 21+1/3 作为结果。
  • 我现在已经重组了这个问题。如果您仍然无法理解任何内容,请告诉我。
【解决方案2】:

简短回答:是的,有这样一个公式。

长答案(我猜你想要公式):

如何获得:您已经意识到求和公式与 int 除法之和之间的差异来自每个被加数的 int 除法的舍入。

用行制作一个表格:

第一行,每个加法的结果,当您以全精度除法时。

第二行,每个被加数的结果,当你执行整数除法时。

还有第三排,两者的区别。

现在你应该意识到这个模式,它总是 1/3、0、2/3。

这来自除以 3,如果你愿意,你可以证明它是正式的(例如归纳法)。

所以最后你的公式是:(n^2)/3 - (n/3)

n*n/3 是常规求和公式,对于所有完整的 3 个和数,我们减去 n/3。

【讨论】:

    【解决方案3】:

    结果是

    1+1 + 2 + 3+3 + 4 + 5+5 + 6 + 7+7 + 8 + 9+9 + 10 + ...
    

    换句话说,所有奇数出现两次,所有偶数出现一次。第一个n 自然数之和是n*(n+1)/2,所以第一个n 偶数自然数之和是它的两倍,而第一个n 奇数之和是n*n

    我认为您现在已经拥有了获得所需结果的所有部分......

    【讨论】:

      【解决方案4】:

      为了增加ns,您需要的总和是: 1、2、4、7、10、14、19、24、30、36 ...

      将这些插入The On-Line Encyclopedia of Integer Sequences™ (OEIS™),您将获得A007980 作为符合您要求的系列。计算为a(n)=ceil((n+1)*(n+2)/3)。

      这使得 a(0) = 1, a(1) = 2, a(6) = 19,意味着索引偏移 2:sum(1,8) = a(8-2)。

      【讨论】:

        【解决方案5】:
        Σ((2i+1)/3) where i =0 to n-1 and Σ((2i+1)/3) = n*n/3
        

        【讨论】:

        • 嗨,Prasad,您使用求和规则得出了这个结果,但这不适用于我的要求,因为每个术语都需要单独划分,而 1/3 不能在最后一步。
        【解决方案6】:
        #include <stdio.h>
        
        typedef struct fraction {
            int n;//numerator
            int d;//denominator
        } Fraction;
        
        int gcd(int x, int y){
            x = (x < 0)? -x : x;
            y = (y < 0)? -y : y;
            while(y){
                int wk;
                wk = x % y;
                x = y;
                y = wk;
            }
        
            return x;
        }
        
        Fraction rcd(Fraction x){
            int gcm;
            gcm = gcd(x.n, x.d);
            x.n /= gcm;
            x.d /= gcm;
            return x;
        }
        
        Fraction add(Fraction x, Fraction y){
            x.n = y.d*x.n + x.d*y.n;
            x.d = x.d*y.d;
            return rcd(x);
        }
        
        int main(void){
            Fraction sum = {0,1};
            int n;
        
            for(n=1;n<=8;++n){
                Fraction x = { 2*n-1, 3 };
                sum = add(sum, x);
            }
            printf("%d/%d=",sum.n,sum.d);
            printf("%d",sum.n/sum.d);
        
            return 0;
        }
        

        【讨论】:

        • 这比假装使用以 3 为底的定点更糟糕。 :) OP 要求 O(1) 公式。
        • @Alex , Σ((2i-1)/3) -> 1/3Σ(2i-1) -> 1/3{2Σi -n} -> 1/3{2n(n +1)/2 -n} -> 1/3 {n^2} : O(1)
        • OP 想要一个公式,用于将项的总和除以 3,就像在 C 中一样,也就是说,就好像它不是正常的除法,而是整数/向下舍入/截断,你知道的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-07
        • 1970-01-01
        • 1970-01-01
        • 2015-05-23
        相关资源
        最近更新 更多