সংক্ষিপ্ত উত্তর
একটি পূর্ণসংখ্যার ব্যাপ্তির জন্য:
Enumerable#sum
আয় (range.max-range.min+1)*(range.max+range.min)/2
Enumerable#inject(:+)
প্রতিটি উপাদান উপর পুনরাবৃত্তি।
তত্ত্ব
1 এবং এর মধ্যে পূর্ণসংখ্যার যোগফলকে ত্রিভুজাকৃতির সংখ্যাn
বলে এবং এটি সমান ।n*(n+1)/2
মধ্যে পূর্ণসংখ্যার যোগফল n
এবং m
এর ত্রিদলীয় সংখ্যা m
বিয়োগ এর ত্রিদলীয় সংখ্যা n-1
, যা সমান m*(m+1)/2-n*(n-1)/2
, এবং লেখা যেতে পারে (m-n+1)*(m+n)/2
।
রুবি ২.৪-তে অনুমিত # সমষ্টি
Enumerable#sum
পূর্ণসংখ্যা ব্যাপ্তির জন্য ব্যবহৃত এই সম্পত্তি :
if (RTEST(rb_range_values(obj, &beg, &end, &excl))) {
if (!memo.block_given && !memo.float_value &&
(FIXNUM_P(beg) || RB_TYPE_P(beg, T_BIGNUM)) &&
(FIXNUM_P(end) || RB_TYPE_P(end, T_BIGNUM))) {
return int_range_sum(beg, end, excl, memo.v);
}
}
int_range_sum
এটা এমন দেখতে :
VALUE a;
a = rb_int_plus(rb_int_minus(end, beg), LONG2FIX(1));
a = rb_int_mul(a, rb_int_plus(end, beg));
a = rb_int_idiv(a, LONG2FIX(2));
return rb_int_plus(init, a);
যা এর সমান:
(range.max-range.min+1)*(range.max+range.min)/2
পূর্বোক্ত সমতা!
জটিলতা
এই অংশের জন্য @ কে_জি এবং @ হায়েনেক-পিচি-ভ্যাচোডিলকে অনেক ধন্যবাদ!
সমষ্টি
(1...1000000000000000000000000000000).sum
তিনটি সংযোজন, একটি গুণ, একটি বিয়োগ এবং একটি বিভাগ প্রয়োজন।
এটি অবিচ্ছিন্ন ক্রিয়াকলাপ, তবে গুণনটি হ'ল ((লগ এন) ²), সুতরাং Enumerable#sum
পূর্ণসংখ্যার ব্যাপ্তির জন্য ও ((লগ এন)।) Is
উদ্বুদ্ধ করা
(1...1000000000000000000000000000000).inject(:+)
9999999999999999999999999999998 সংযোজন প্রয়োজন!
সংযোজন হ'ল ও (লগ এন), Enumerable#inject
ও (এন লগ এন)।
সঙ্গে 1E30
ইনপুট হিসাবে, inject
সঙ্গে আসতে না। সূর্য ফেটে যাবে অনেক আগেই!
পরীক্ষা
রুবি পূর্ণসংখ্যার যোগ হচ্ছে কিনা তা যাচাই করা সহজ:
module AdditionInspector
def +(b)
puts "Calculating #{self}+#{b}"
super
end
end
class Integer
prepend AdditionInspector
end
puts (1..5).sum
#=> 15
puts (1..5).inject(:+)
# Calculating 1+2
# Calculating 3+3
# Calculating 6+4
# Calculating 10+5
#=> 15
প্রকৃতপক্ষে, enum.c
মন্তব্যগুলি থেকে :
Enumerable#sum
পদ্ধতি "+"
যেমন পদ্ধতিগুলির পুনঃনির্ধারণকে সম্মান করতে পারে না Integer#+
।