ตรวจสอบทฤษฎีบทของ Wolstenholme


14

คำนิยาม

ทฤษฎีบทของ Wolstenholmeกล่าวว่า:

ทฤษฎีบทของ Wolstenholme

ที่ aและbเป็นจำนวนเต็มบวกและpเป็นสำคัญและวงเล็บใหญ่ thingy เป็นทวินามค่าสัมประสิทธิ์

งาน

เพื่อตรวจสอบว่าคุณจะได้รับสามปัจจัยการผลิต: a, b, pที่aและbเป็นจำนวนเต็มบวกและpเป็นสำคัญ

คำนวณ:

การตรวจสอบทฤษฎีบทของ Wolstenholme

ที่ aและbเป็นจำนวนเต็มบวกและpเป็นสำคัญและวงเล็บ thingy เป็นทวินามค่าสัมประสิทธิ์

รายละเอียด

ตั้งแต่:

combinatorics

ที่ไหนและวงเล็บ thingy เป็นทวินามค่าสัมประสิทธิ์

คุณสามารถสันนิษฐานได้ว่า 2b <= a

Testcases

a b p  output
6 2 5  240360
3 1 13 3697053
7 3 13 37403621741662802118325

2
ฉันรู้สึกเหมือนเอาท์พุทควรจะมี.0ที่สิ้นสุดเพื่อให้มันแสดงให้เห็นว่าไม่มี leftover.from ส่วน
El'endia Starman

3
@ El'endiaStarman Come on
Leun Nun

1
หากว่า[240360](เดี่ยวอาร์เรย์) เป็นรูปแบบการออกยอมรับ?
Dennis

1
ฉันไม่คิดว่ามีอย่างใดอย่างหนึ่งซึ่งเป็นสาเหตุที่ฉันถาม
Dennis

2
@Dennis จากนั้นทำอย่างใดอย่างหนึ่ง
Leun Nun

คำตอบ:


5

Haskell, 73 71 ไบต์

เนื่องจากการเรียกซ้ำการดำเนินการนี้ช้ามาก import Math.Combinatorics.Exact.Binomialแต่น่าเสียดายที่ความหมายของฉันสัมประสิทธิ์ทวินามมีความยาวเช่นเดียวกับ

n#k|k<1||k>=n=1|1>0=(n-1)#(k-1)+(n-1)#k --binomial coefficient
f a b p=div((a*p)#(b*p)-a#b)p^3       --given formula

สิ่งแปลกประหลาดที่น่าสนใจคือ Haskell 98 อนุญาตให้ใช้รูปแบบทางคณิตศาสตร์ซึ่งจะทำให้รหัสเดียวกันสั้นลงเป็น 64 ไบต์:

g a b p=div((a*p)#(b*p)-a#b)p^3
n+1#k|k<1||k>n=1|1>0=n#(k-1)+n#k

5
รุ่น Haskell 98 ไม่ควรส่งที่ถูกต้องหรือไม่
Michael Klein

4

เจลลี่ , 12 11 10ไบต์

ż×c/I÷S÷²}

คาดว่า a, bและpเป็นอาร์กิวเมนต์บรรทัดคำสั่ง

ลองออนไลน์!หรือตรวจสอบกรณีทดสอบทั้งหมด

มันทำงานอย่างไร

ż×c/I÷S÷²}  Main link. Left argument: a, b. Right argument: p

 ×          Multiply; yield [pa, pb].
ż           Zipwith; yield [[a, pa], [b, pb]].
  c/        Reduce columns by combinations, yielding [aCb, (pa)C(pb)].
    I       Increments; yield [(pa)C(pb) - aCb].
     ÷      Divide; yield [((pa)C(pb) - aCb) ÷ p].
      S     Sum; yield ((pa)C(pb) - aCb) ÷ p.
        ²}  Square right; yield p².
       ÷    Divide; yield  ((pa)C(pb) - aCb) ÷ p³.

4

Python 2, 114 109 85 71 ไบต์

ใช้งานง่าย ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ

แก้ไข: -29 bytes จาก Leaky Nun และ -14 bytes ขอบคุณ Dennis

lambda a,b,p,f=lambda n,m:m<1or f(n-1,m-1)*n/m:(f(a*p,b*p)-f(a,b))/p**3

ทางเลือกที่เรียบง่ายกว่าเดิมมีความยาวเท่ากันโดยมีเดนนิสขอบคุณ

f=lambda n,m:m<1or f(n-1,m-1)*n/m
lambda a,b,p:(f(a*p,b*p)-f(a,b))/p**3

นี่คือแลมบ์เรียลที่ตีกอล์ฟ
NonlinearFruit

3

05AB1E , 11 ไบต์

ใช้อินพุตเป็น:

[a, b]
p

รหัส:

*`c¹`c-²3m÷

ใช้การเข้ารหัสCP-1252 ลองออนไลน์! .


คุณออกไปเล่นกอล์ฟเดนนิสหรือไม่?
Leun Nun

9
ถ้าฉันอยู่ในรองเท้าของเดนนิสฉันคิดว่าฉันจะรู้สึกเบื่อหน่ายกับความคิดเห็น "outgolf Dennis" เหล่านี้ทั้งหมด ...
Luis Mendo

7
@ LuisMendo ฉันอาจหรืออาจไม่ได้รับการอบเป็นประจำ
Dennis

2
และนะที่ 10 มันสนุกในขณะที่มันกินเวลาชาย
downrep_nation

3

R, 50 48 ไบต์

function(a,b,p)(choose(a*p,b*p)-choose(a,b))/p^3

ตรงไปตรงมาที่สุดเท่าที่จะทำได้ ... ต้องขอบคุณ @Neil สำหรับการบันทึก 2 ไบต์


1
จำเป็นต้องมีช่องว่างจำนวนเท่าใด
Neil

42 ไบต์โดยการเปลี่ยนชื่อchooseและโดยการใช้การกำหนดฟังก์ชั่น:pryr::f B=choose;pryr::f((B(a*p,b*p)-B(a,b))/p^3)
rturnbull

2

MATL , 13 ไบต์

y*hZ}Xnd2G3^/

ลองออนไลน์!

กรณีทดสอบครั้งสุดท้ายไม่ได้ผลิตจำนวนเต็มอย่างแน่นอนเนื่องจากความแม่นยำเชิงตัวเลข ประเภทข้อมูลเริ่มต้นของ MATL ( double) สามารถจัดการได้เฉพาะจำนวนเต็มถึง2^53เท่านั้น

คำอธิบาย

y   % Implicitly input [a; b] (col vector) and p (number). Push another copy of [a; b]
    %   Stack: [a; b], p, [a; b]
*   % Multiply the top two elements from the stack
    %   Stack: [a; b], [a*p; b*p]
h   % Concatenate horizontally
    %   Stack: [a, a*p; b, b*p]
Z}  % Split along first dimension
    %   Stack: [a, a*p], [b, b*p]
Xn  % Vectorize nchoosek
    %   Stack: [nchoosek(a,b), nchoosek(a*p,b*p)]
d   % Consecutive differences of array
    %   Stack: nchoosek(a,b)-nchoosek(a*p,b*p)
2G  % Push second input again
    %   Stack: nchoosek(a,b)-nchoosek(a*p,b*p), p
3^  % Raise to third power
    %   Stack: nchoosek(a,b)-nchoosek(a*p,b*p), p^3
/   % Divide top two elements from the stack
    %   Stack: (nchoosek(a,b)-nchoosek(a*p,b*p))/p^3
    % Implicitly display

2

J, 17 ไบต์

(!/@:*-!/@[)%]^3:

การใช้

(b,a) ( (!/@:*-!/@[)%]^3: ) p

ตัวอย่างเช่น:

   2 6 ( (!/@:*-!/@[)%]^3: ) 5
240360

นี่เป็นเพียงการติดตั้งสูตรโดยตรงเท่านั้น

หมายเหตุ : สำหรับหมายเลขอินพุต testcase ที่ 3 ต้องกำหนดเป็นแบบขยาย (เพื่อจัดการเลขคณิตขนาดใหญ่):

   3x 7x ( (!/@:*-!/@[)%]^3: ) 13x
37403621741662802118325

2

Brachylogขนาด 52 ไบต์

tT;T P&t^₃D&h↰₁S&h;Pz×₎ᵐ↰₁;S-;D/
hḟF&⟨{-ḟ}×{tḟ}⟩;F↻/

ลองออนไลน์!

[[a, b], p]รับข้อมูล

% Predicate 1 - Given [n, r], return binomial(n, r)
hḟF              % Compute n!, set as F
&⟨               % Fork:
  {-ḟ}           % (n - r)!
  ×              % times
  {tḟ}           % r!
⟩                
;F↻              % Prepend n! to that
/                % Divide n! by the product and return

% Predicate 0 (Main)
tT;T P           % Set P to the array [p, p] 
&t^₃D            % Set D as p^3
&h↰₁S            % Call predicate 1 on [a, b], 
                 %  set S as the result binomial(a, b)
&h;Pz×₎ᵐ         % Form array [ap, bp]
↰₁               % Call predicate 1 on that to get binomial(ap, bp)
;S-              % Get binomial(ap, bp) - binomial(a, b)
;D/              % Divide that by the denominator term p^3
                 % Implicit output

1

Python 3 พร้อมSciPy , 72 ไบต์

from scipy.special import*
lambda a,b,p:(binom(a*p,b*p)-binom(a,b))/p**3

ฟังก์ชันที่ไม่ระบุตัวตนที่รับอินพุตผ่านอาร์กิวเมนต์และส่งคืนผลลัพธ์

ที่นี่ไม่มีอะไรมาก นี่เป็นการดำเนินการโดยตรงของการคำนวณที่ต้องการ

ลองใช้กับ Ideone (ผลลัพธ์จะถูกส่งคืนในรูปแบบเลขชี้กำลังสำหรับกรณีทดสอบล่าสุด)


1

นิมิต , 85 82 75 59 ไบต์

import math,future
(a,b,p)=>(binom(a*p,b*p)-binom(a,b))/p^3

นี่เป็นขั้นตอนที่ไม่ระบุชื่อ หากต้องการใช้มันจะต้องถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยังกระบวนการอื่นซึ่งพิมพ์ โปรแกรมเต็มรูปแบบที่สามารถใช้สำหรับการทดสอบได้รับด้านล่าง

import math,future
proc test(x: (int, int, int) -> float) =
 echo x(3, 1, 13) # substitute in your input or read from STDIN
test((a,b,p)=>(binom(a*p,b*p)-binom(a,b))/p^3)

proc mathโมดูลของ Nim binomคำนวณสัมประสิทธิ์ทวินามของสองอาร์กิวเมนต์



0

JavaScript (ES6), 70 ไบต์

(a,b,p,c=(a,b)=>a==b|!b||c(--a,b)+c(a,--b))=>(c(a*p,b*p)-c(a,b))/p/p/p

บันทึก 1 ไบต์โดยใช้ ES7 ( /p**3แทน/p/p/p)



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.