สูตรสำหรับความสอดคล้อง


10

จีนที่เหลือทฤษฎีบทจะมีประโยชน์มากในการคำนวณแบบแยกส่วน

ตัวอย่างเช่นพิจารณาชุดของความสัมพันธ์ที่สอดคล้องกันดังต่อไปนี้:

ชุดของความสอดคล้อง

สำหรับชุดของความสัมพันธ์ที่สอดคล้องกันเช่นนี้ที่ฐานทั้งหมด ( 3, 5, 7ในตัวอย่างนี้) เป็นนายกร่วมกันจะมีจำนวนเต็มหนึ่งเดียวเท่านั้นnระหว่าง1และผลิตภัณฑ์ของฐาน ( 3*5*7 = 105ในตัวอย่างนี้) รวมที่สอดคล้องกับความสัมพันธ์ .

ในตัวอย่างนี้จำนวนจะถูก14สร้างโดยสูตรนี้:

สูตร

ที่2, 4, and 0ได้รับจากตัวอย่างข้างต้น

70, 21, 15คือสัมประสิทธิ์ของสูตรและขึ้นอยู่กับฐาน, 3, 5, 7.

ในการคำนวณค่าสัมประสิทธิ์ของสูตร ( 70, 21, 15ในตัวอย่างของเรา) สำหรับชุดฐานเราใช้ขั้นตอนต่อไปนี้

สำหรับแต่ละหมายเลขaในชุดฐาน:

  1. ค้นหาสินค้าทั้งหมดของฐานอื่น ๆ Pที่แสดงเป็น
  2. ค้นหาหลายแรกของPใบที่เหลือของเมื่อหารด้วย1 นี่คือค่าสัมประสิทธิ์ของaa

ตัวอย่างเช่นในการคำนวณค่าสัมประสิทธิ์ที่สอดคล้องกับฐาน3เราจะพบผลิตภัณฑ์ของฐานอื่น ๆ ทั้งหมด (เช่น5*7 = 35) จากนั้นหาค่าคูณแรกของผลิตภัณฑ์นั้นที่เหลือเศษของ1เมื่อถูกหารด้วยฐาน

ในกรณีนี้35ใบที่เหลือของ2เมื่อหารด้วย3แต่35*2 = 70ใบที่เหลือของ1เมื่อหารด้วย3เพื่อเป็นค่าสัมประสิทธิ์ที่สอดคล้องกันสำหรับ70 3ในทำนองเดียวกัน3*7 = 21ใบที่เหลือของ1เมื่อหารด้วย5และ3*5 = 15ใบที่เหลือของเมื่อหารด้วย17

โดยสังเขป

สำหรับแต่ละหมายเลขaในชุดตัวเลข:

  1. ค้นหาสินค้าทั้งหมดของตัวเลขอื่น ๆ Pที่แสดงเป็น
  2. ค้นหาหลายแรกของPใบที่เหลือของเมื่อหารด้วย1 นี่คือค่าสัมประสิทธิ์ของaa

ความท้าทาย

  • ความท้าทายสำหรับชุดของสองฐานขึ้นไปเพื่อค้นหาชุดของค่าสัมประสิทธิ์ที่สอดคล้องกัน
  • ชุดของฐานมีการรับประกันว่าจะเป็นแบบคู่หลักร่วมและแต่ละฐานมีขนาดใหญ่กว่า 1
  • อินพุตของคุณคือรายการจำนวนเต็มเป็น[3,4,5]สตริง"3 4 5"หรือสตริงคั่นด้วยช่องว่างหรืออย่างไรก็ตามอินพุตของคุณทำงาน
  • ผลลัพธ์ของคุณควรเป็นรายการของจำนวนเต็มหรือสตริงคั่นด้วยช่องว่างที่แสดงถึงชุดของค่าสัมประสิทธิ์

กรณีทดสอบ

input             output
[3,5,7]           [70,21,15]
[2,3,5]           [15,10,6]
[3,4,5]           [40,45,36]
[3,4]             [4,9]
[2,3,5,7]         [105,70,126,120]
[40,27,11]        [9801,7480,6480]
[100,27,31]       [61101,49600,56700]
[16,27,25,49,11]  [363825,2371600,2794176,5583600,529200]

ขอบคุณ Leaky Nun เป็นอย่างมากสำหรับความช่วยเหลือในการเขียนความท้าทายนี้ เช่นเคยหากปัญหายังไม่ชัดเจนโปรดแจ้งให้เราทราบ ขอให้โชคดีและการเล่นกอล์ฟที่ดี!


จะมี 3 หมายเลขในอินพุตหรือไม่
xnor

@xnor Nope กรณีทดสอบแก้ไข
Sherlock9

คำตอบ:


5

Haskell, 61 55 53 ไบต์

f x=[[p|p<-[0,product x`div`n..],p`mod`n==1]!!0|n<-x]

กำหนดฟังก์ชั่น fที่รับอินพุตและให้เอาต์พุตเป็นรายการจำนวนเต็ม

f x=[                                          |n<-x]  (1)
              product x                                (2)
                       `div`n                          (3)

ก่อนอื่นเราวนรอบจำนวนเต็มทั้งหมดในอินพุต (1) จากนั้นเราก็หาผลคูณของจำนวนเต็มทั้งหมด (2) แล้วหารด้วย n เพื่อหาผลคูณของnจำนวนเต็มซึ่งก็คือP(3)

           [0,               ..]                       (4)
     [p|p<-                     ,p`mod`n==1]           (5)
                                            !!0        (6)

จากนั้นเราใช้ผลลัพธ์ (P ) เป็นค่าขั้นตอนสำหรับช่วงที่เริ่มต้นที่ศูนย์ (4) เรารับผลลัพธ์[0, P, 2P, 3P, ...]และกรองตามค่าที่ผลลัพธ์ของการดำเนินการ mod-n คือหนึ่ง (5) ในที่สุดเราใช้องค์ประกอบแรกซึ่งทำงานได้ดีเนื่องจากการประเมินที่ขี้เกียจ (6)

ขอบคุณ@xnor 2 ไบต์!


1
ยินดีต้อนรับสู่ Haskell! ผมคิดว่าคุณquotสามารถเป็นdivและสามารถhead !!0
xnor

4

เจลลี่ , 11 7 ไบต์

P:*ÆṪ%P

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

พื้นหลัง

ให้Pและเป็นบวกอย่างเคร่งครัดcoprimeจำนวนเต็ม

กระบวนการขั้นตอนที่สองในคำถาม - หาหลายของPที่ใบที่เหลือของ1เมื่อหารด้วย- สามารถอธิบายได้ด้วยสมการความสอดคล้องกันดังต่อไปนี้

สมการความสอดคล้องเชิงเส้น

ตามทฤษฎีของออยเลอร์ - แฟร์มาต์เรามี

ทฤษฎีบทออยเลอร์ - แฟร์มาต์

ที่φหมายถึงtotient ฟังก์ชันออยเลอร์ จากผลลัพธ์นี้เราอนุมานดังต่อไปนี้

สูตรสำหรับสมการความสอดคล้องเชิงเส้น

ในที่สุดเนื่องจากความท้าทายต้องการให้เราคำนวณPxเราจึงสังเกตว่า

สูตรสำหรับผลลัพธ์ขั้นสุดท้าย

ที่ป่าสามารถคำนวณได้ว่าเป็นผลิตภัณฑ์ของ moduli ทั้งหมด

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

P:*ÆṪ%P  Main link. Argument: A (list of moduli)

P        Yield the product of all moduli.
 :       Divide the product by each modulus in A.
   ÆṪ    Apply Euler's totient function to each modulus.
  *      Raise each quotient to the totient of its denominator.
     %P  Compute the remainder of the powers and the product of all moduli.

2

J, 13 ไบต์

*/|5&p:^~*/%]

ตามคำตอบที่น่าอัศจรรย์ของ @Dennisคำตอบ

การใช้

xบางกรณีทดสอบจะต้องป้อนข้อมูลที่เป็นจำนวนเต็มขยายที่มีคำต่อท้าย

   f =: */|5&p:^~*/%]
   f 3 5 7
70 21 15
   f 40x 27 11
9801 7480 6480
   f 16x 27 25 49 11
363825 2371600 2794176 5583600 529200

คำอธิบาย

*/|5&p:^~*/%]  Input: list B
         */    Reduce B using multiplication to get the product of the values
            ]  Identity function, get B
           %   Divide the product by each value in B, call the result M
   5&p:        Apply the totient function to each value in B, call the result P
       ^~      Raise each value in M to the power of its corresponding value in P
*/             The product of the values in B
  |            Compute each power modulo the product and return

ลองที่นี่




1

เยลลี่ขนาด14 13 ไบต์

P:×"Ḷð%"’¬æ.ḷ

บันทึกเป็นไบต์ด้วย @ Dennis !

ใช้กระบวนการที่อธิบายไว้ในข้อมูลจำเพาะการท้าทาย อินพุตเป็นรายการของเบสและเอาต์พุตเป็นรายการของสัมประสิทธิ์

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

คำอธิบาย

P:×"Ḷð%"’¬æ.ḷ  Input: a list B
P              Get the product of the list
 :             Divide it by each value in the B, call it M
    Ḷ          Get a range from 0 to k for k in B
  ×"           Vectorized multiply, find the multiples of each M
     ð         Start a new dyadic chain. Input: multiples of M and B
      %"       Vectorized modulo, find the remainders of each multiple by B
        ’      Decrement every value
               If the remainder was 1, decrementing would make it 0
         ¬     Logical NOT, zeros become one and everything else becomes 0
            ḷ  Get the multiples of M
          æ.   Find the dot product between the modified remainders and the multiples
               Return

1

JavaScript (ES6), 80 ไบต์

a.map(e=>[...Array(e).keys()].find(i=>p*i/e%e==1)*p/e,p=a.reduce((i,j)=>i*j))

ฉันลองอัลกอริทึมแบบยุคลิดแบบขยาย แต่ใช้เวลา 98 ไบต์:

a=>a.map(e=>(r(e,p/e)+e)%e*p/e,p=a.reduce((i,j)=>i*j),r=(a,b,o=0,l=1)=>b?r(b,a%b,t,o-l*(a/b|0)):o)

หากค่านั้นเป็นไพรม์ทั้งหมด ES7 สามารถทำได้ใน 56 ไบต์:

a=>a.map(e=>(p/e%e)**(e-2)%e*p/e,p=a.reduce((i,j)=>i*j))

1

Python + SymPy, 71 ไบต์

from sympy import*
lambda x:[(prod(x)/n)**totient(n)%prod(x)for n in x]

นี้ใช้อัลกอริทึมจากคำตอบของวุ้นของฉัน I / O อยู่ในรูปแบบรายการหมายเลข SymPy


1

Python 2, 87 84 ไบต์

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

a=input();p=1
for i in a:p*=i
print[p/i*j for i in a for j in range(i)if p/i*j%i==1]

โปรแกรมเต็มรูปแบบจะบันทึก 3 ไบต์
เดนนิส


0

GAP , 51 ไบต์

GAP มีฟังก์ชั่นที่สามารถคำนวณตัวอย่างแรงจูงใจด้วยChineseRem([2,5,7],[2,4,0])แต่ก็ยังไม่ได้ทำให้มันง่ายที่จะได้รับค่าสัมประสิทธิ์ เราสามารถรับค่าสัมประสิทธิ์ n-th โดยใช้รายการที่มีหนึ่งในตำแหน่งที่ n และศูนย์ที่ตำแหน่งอื่นเป็นอาร์กิวเมนต์ที่สอง ดังนั้นเราต้องสร้างรายการเหล่านี้และใช้ฟังก์ชั่นกับพวกเขาทั้งหมด:

l->List(Basis(Integers^Size(l)),b->ChineseRem(l,b))

0

แบตช์ 148 ไบต์

@set p=%*
@set/ap=%p: =*%
@for %%e in (%*)do @for /l %%i in (1,1,%%e)do @call:l %%e %%i
@exit/b
:l
@set/an=p/%1*%2,r=n%%%1
@if %r%==1 echo %n%

0

จริงแล้ว 14 ไบต์

นี้ใช้อัลกอริทึมในเดนนิสคำตอบของวุ้น คำตอบอื่นที่อิงตามคำตอบของ Python ของฉันคือการเตรียมพร้อม ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ ลองออนไลน์!

;π;)♀\;♂▒@♀ⁿ♀%

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

                 Implicit input a.
;                Duplicate a.
 π;)             Take product() of a, duplicate and rotate to bottom.
    ♀\           Integer divide the product by each element of a. Call this list b.
      ;♂▒        Take that list, duplicate, and get the totient of each element.
         @♀ⁿ     Swap and take pow(<item in b>, <corresponding totient>)
            ♀%   Modulo each item by the remaining duplicate product on the stack.
                 Implicit return.

คำตอบอื่น ๆ ตามคำตอบของ Python ที่ 22 ไบต์ ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ ลองออนไลน์!

;π╖`╝╛╜\╛r*"╛@%1="£░`M

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

            Implicit input a.
;π╖         Duplicate, take product of a, and save to register 0.
`...`M      Map over a.
  ╝           Save the item, b, in register 1.
  ╛╜\         product(a) // b. Call it P.
  ╛r          Take the range [0...b].
  *           Multiply even item in the range by P. Call this list x.
  "..."£░     Turn a string into a function f.
              Push values of [b] where f returns a truthy value.
    ╛@%         Push b, swap, and push <item in x> % b.
    1=          Does <item> % b == 1?
            Implicit return.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.