--- Day changed Wed Mar 03 2021 00:22 -!- gleb [~gleb@178.150.137.228] has quit [Quit: Ping timeout (120 seconds)] 00:22 -!- b10c [~b10c@static.55.136.76.144.clients.your-server.de] has quit [Quit: ZNC 1.8.1 - https://znc.in] 00:22 -!- gleb [~gleb@178.150.137.228] has joined #bitcoin-core-pr-reviews 00:22 -!- sipa [~pw@gateway/tor-sasl/sipa1024] has quit [Remote host closed the connection] 00:22 -!- sipa [~pw@gateway/tor-sasl/sipa1024] has joined #bitcoin-core-pr-reviews 00:22 -!- b10c [~b10c@static.55.136.76.144.clients.your-server.de] has joined #bitcoin-core-pr-reviews 00:42 -!- andrewtoth_ [~andrewtot@gateway/tor-sasl/andrewtoth] has joined #bitcoin-core-pr-reviews 00:43 -!- kiltzman [~k1ltzman@195.189.99.96] has quit [Ping timeout: 240 seconds] 00:43 -!- _andrewtoth_ [~andrewtot@gateway/tor-sasl/andrewtoth] has quit [Remote host closed the connection] 00:49 -!- kiltzman [~k1ltzman@195.189.99.96] has joined #bitcoin-core-pr-reviews 00:57 -!- S3RK_ [~S3RK@213.55.241.111] has quit [Quit: leaving] 00:58 -!- S3RK [~S3RK@213.55.241.111] has joined #bitcoin-core-pr-reviews 01:12 -!- vasild [~vd@gateway/tor-sasl/vasild] has quit [Ping timeout: 268 seconds] 01:30 -!- vasild [~vd@gateway/tor-sasl/vasild] has joined #bitcoin-core-pr-reviews 01:54 -!- shafiunmiraz0 [~shafiunmi@103.220.205.190] has joined #bitcoin-core-pr-reviews 01:55 -!- shafiunmiraz0 [~shafiunmi@103.220.205.190] has left #bitcoin-core-pr-reviews [] 01:57 -!- shafiunmiraz0 [~shafiunmi@103.220.205.190] has joined #bitcoin-core-pr-reviews 01:59 -!- shafiunmiraz0 [~shafiunmi@103.220.205.190] has quit [Quit: Leaving] 02:02 -!- vasild [~vd@gateway/tor-sasl/vasild] has quit [Ping timeout: 268 seconds] 02:03 -!- vasild [~vd@gateway/tor-sasl/vasild] has joined #bitcoin-core-pr-reviews 02:08 -!- vasild [~vd@gateway/tor-sasl/vasild] has quit [Ping timeout: 268 seconds] 02:10 -!- belcher_ is now known as belcher 02:15 -!- musdom [~Thunderbi@202.184.0.102] has quit [Ping timeout: 245 seconds] 02:38 -!- vasild [~vd@gateway/tor-sasl/vasild] has joined #bitcoin-core-pr-reviews 02:51 -!- vasild [~vd@gateway/tor-sasl/vasild] has quit [Ping timeout: 268 seconds] 03:20 -!- Damien65Tremblay [~Damien65T@static.57.1.216.95.clients.your-server.de] has joined #bitcoin-core-pr-reviews 03:34 -!- Damien65Tremblay [~Damien65T@static.57.1.216.95.clients.your-server.de] has quit [Ping timeout: 260 seconds] 04:22 -!- vasild [~vd@gateway/tor-sasl/vasild] has joined #bitcoin-core-pr-reviews 04:39 -!- pinheadmz [~pinheadmz@pool-71-105-114-182.nycmny.fios.verizon.net] has joined #bitcoin-core-pr-reviews 04:48 -!- jonatack [~jon@37.172.59.183] has joined #bitcoin-core-pr-reviews 04:53 -!- mol_ [~mol@unaffiliated/molly] has joined #bitcoin-core-pr-reviews 04:54 -!- musdom [~Thunderbi@202.184.0.102] has joined #bitcoin-core-pr-reviews 04:56 -!- mol [~mol@unaffiliated/molly] has quit [Ping timeout: 260 seconds] 05:05 -!- vasild [~vd@gateway/tor-sasl/vasild] has quit [Ping timeout: 268 seconds] 05:11 -!- vasild [~vd@gateway/tor-sasl/vasild] has joined #bitcoin-core-pr-reviews 05:22 -!- jonatack [~jon@37.172.59.183] has quit [Read error: Connection reset by peer] 05:24 -!- jonatack [~jon@37.172.59.183] has joined #bitcoin-core-pr-reviews 06:05 -!- mol [~mol@unaffiliated/molly] has joined #bitcoin-core-pr-reviews 06:07 -!- mol_ [~mol@unaffiliated/molly] has quit [Ping timeout: 260 seconds] 06:16 -!- pinheadm_ [~pinheadmz@pool-71-105-114-182.nycmny.fios.verizon.net] has joined #bitcoin-core-pr-reviews 06:16 -!- vasild [~vd@gateway/tor-sasl/vasild] has quit [Ping timeout: 268 seconds] 06:17 -!- pinheadmz [~pinheadmz@pool-71-105-114-182.nycmny.fios.verizon.net] has quit [Ping timeout: 240 seconds] 06:19 -!- pinheadm_ [~pinheadmz@pool-71-105-114-182.nycmny.fios.verizon.net] has quit [Client Quit] 06:19 -!- pinheadmz [~pinheadmz@pool-71-105-114-182.nycmny.fios.verizon.net] has joined #bitcoin-core-pr-reviews 06:27 -!- jonatack [~jon@37.172.59.183] has quit [Ping timeout: 246 seconds] 06:28 -!- jonatack [~jon@37.172.59.183] has joined #bitcoin-core-pr-reviews 06:42 -!- jonatack_ [~jon@37.172.59.183] has joined #bitcoin-core-pr-reviews 06:42 -!- jonatack [~jon@37.172.59.183] has quit [Read error: Connection reset by peer] 06:42 -!- vasild [~vd@gateway/tor-sasl/vasild] has joined #bitcoin-core-pr-reviews 06:44 -!- jonatack_ [~jon@37.172.59.183] has quit [Client Quit] 06:45 -!- vasild [~vd@gateway/tor-sasl/vasild] has quit [Remote host closed the connection] 06:46 -!- jonatack [~jon@37.172.59.183] has joined #bitcoin-core-pr-reviews 06:52 -!- jonatack [~jon@37.172.59.183] has quit [Ping timeout: 260 seconds] 06:54 -!- jonatack [~jon@37.172.59.183] has joined #bitcoin-core-pr-reviews 06:57 -!- vasild [~vd@gateway/tor-sasl/vasild] has joined #bitcoin-core-pr-reviews 07:01 -!- jadi [~jadi@213.207.205.209] has quit [Remote host closed the connection] 07:05 -!- vasild [~vd@gateway/tor-sasl/vasild] has quit [Ping timeout: 268 seconds] 07:10 -!- davterra [~davterra@gateway/tor-sasl/tralfaz] has joined #bitcoin-core-pr-reviews 07:12 -!- _andrewtoth_ [~andrewtot@gateway/tor-sasl/andrewtoth] has joined #bitcoin-core-pr-reviews 07:15 -!- andrewtoth_ [~andrewtot@gateway/tor-sasl/andrewtoth] has quit [Ping timeout: 268 seconds] 07:17 -!- vasild [~vd@gateway/tor-sasl/vasild] has joined #bitcoin-core-pr-reviews 07:22 -!- pinheadmz [~pinheadmz@pool-71-105-114-182.nycmny.fios.verizon.net] has quit [Quit: pinheadmz] 07:29 -!- vasild [~vd@gateway/tor-sasl/vasild] has quit [Ping timeout: 268 seconds] 07:34 -!- luke-jr [~luke-jr@unaffiliated/luke-jr] has joined #bitcoin-core-pr-reviews 07:35 -!- pinheadmz [~pinheadmz@hns-contributor.dev] has joined #bitcoin-core-pr-reviews 07:55 -!- musdom [~Thunderbi@202.184.0.102] has quit [Ping timeout: 245 seconds] 07:57 -!- luke-jr [~luke-jr@unaffiliated/luke-jr] has quit [Ping timeout: 240 seconds] 08:08 -!- luke-jr [~luke-jr@unaffiliated/luke-jr] has joined #bitcoin-core-pr-reviews 08:15 -!- vasild [~vd@gateway/tor-sasl/vasild] has joined #bitcoin-core-pr-reviews 08:22 -!- jonatack [~jon@37.172.59.183] has quit [Ping timeout: 260 seconds] 08:28 -!- jonatack [~jon@37.172.59.183] has joined #bitcoin-core-pr-reviews 08:30 -!- jonatack [~jon@37.172.59.183] has quit [Read error: Connection reset by peer] 08:30 < jnewbery> Hi folks. We'll get started in half an hour! Hope you're all ready for more minisketch! 08:30 -!- jonatack [~jon@37.172.59.183] has joined #bitcoin-core-pr-reviews 08:31 -!- jonatack [~jon@37.172.59.183] has quit [Read error: Connection reset by peer] 08:31 -!- jonatack_ [~jon@37.172.59.183] has joined #bitcoin-core-pr-reviews 08:33 -!- mol_ [~mol@unaffiliated/molly] has joined #bitcoin-core-pr-reviews 08:37 -!- mol [~mol@unaffiliated/molly] has quit [Ping timeout: 260 seconds] 08:38 -!- jonatack_ [~jon@37.172.59.183] has quit [Quit: jonatack_] 08:44 -!- jonatack [~jon@37.172.59.183] has joined #bitcoin-core-pr-reviews 08:46 -!- seven_ [~seven@cpe-90-157-197-248.static.amis.net] has quit [Read error: Connection reset by peer] 08:47 < jonatack> Can someone please save the meeting log. My internet becomes extremely flakey around this time of day due to covid-related measures (the meeting time corresponds to the start of martial law 1800-0600 and the population is a multiple of normal due to people fleeing the urban centers again where lockdowns are once again starting) 08:47 < sipa> i have logs 08:47 < jonatack> ty 08:48 < pinheadmz> hm we need bitcoin-core-pr-review satellite 08:48 < jonatack> i need starlink 08:49 < jonatack> (thankful there is almost no covid here, just people fleeing it and the restrictions and infra not adapted) 08:51 -!- bitcoinmuc [bc62dd33@dslb-188-098-221-051.188.098.pools.vodafone-ip.de] has joined #bitcoin-core-pr-reviews 08:52 -!- larryruane_ [uid473749@gateway/web/irccloud.com/x-lmsrftnnjdmdxmiz] has joined #bitcoin-core-pr-reviews 08:52 -!- andozw [43056ef6@67-5-110-246.spok.qwest.net] has joined #bitcoin-core-pr-reviews 08:54 -!- tkc [~tkc@162.154.243.234] has joined #bitcoin-core-pr-reviews 08:57 -!- eoin [3325648b@51.37.100.139] has joined #bitcoin-core-pr-reviews 08:58 -!- kouloumos [5d6d8fd3@93-143-211.internethome.cytanet.com.cy] has joined #bitcoin-core-pr-reviews 09:00 < jnewbery> I can upload logs tonight 09:00 < jnewbery> #startmeeting 09:00 < jnewbery> hi folks! 09:00 < larryruane_> hi 09:00 < pinheadmz> hi 09:00 < felixweis> hi 09:00 < andozw> yoooo 09:00 < emzy> hi 09:00 < kouloumos> hi! 09:00 < jnewbery> feel free to say hi to let everyone know you're here 09:00 < jnewbery> anyone here for the first time? 09:00 < tkc> hi-new here-first time 09:00 < eoin> hi, my third review 09:01 < jnewbery> tkc: welcome! 09:01 -!- Netsplit *.net <-> *.split quits: Murch, raj_149, nehan 09:01 < kouloumos> first time of 2021 ;) 09:01 < jonatack> hi 09:01 < jnewbery> Today we'll be continuing the discussion about Minisketch from two weeks ago 09:01 < tkc> thanks-initial steps in learn to program the core-long road ahead. :) 09:01 -!- ma [92732bd1@146.115.43.209] has joined #bitcoin-core-pr-reviews 09:01 < jnewbery> Notes, questions and logs from that meeting are here: https://bitcoincore.reviews/minisketch-26. We got up to question 5 last time I think. 09:01 < jnewbery> ok, over to sipa! 09:02 -!- ma is now known as Guest8267 09:02 < sipa> sorry, laptop troubles! 09:02 < sipa> be right there 09:02 < eoin> hi, my third review 09:02 -!- lightlike [~lightlike@p200300c7ef119f002c09a758dd7fa4c8.dip0.t-ipconnect.de] has joined #bitcoin-core-pr-reviews 09:02 < jnewbery> anyone know any good minisketch puns while sipa sorts out his laptop? 09:03 < jonatack> since i warned about flakey internet, it will probably work flawlessly this time 09:03 < sipa> ok! 09:03 < pinheadmz> I know this many miniskettch puns: x^6 + x^5 + x^4 + x^3 + x^2 + x 09:04 < sipa> i heard there are an infinite number of papers to write about real analysis, but today we don't need to worry about that because we're working in a finite field 09:04 -!- shaunsun [shaunsun@gateway/vpn/privateinternetaccess/shaunsun] has joined #bitcoin-core-pr-reviews 09:04 * pinheadmz *cough* 09:04 < sipa> so 09:04 < glozow> when u trying to solve polynomial it can get kinda berlekamp messy 09:04 < sipa> everybody awake? 09:05 < emzy> *g* 09:05 -!- fodediop [~fode@41.214.81.87] has joined #bitcoin-core-pr-reviews 09:05 < sipa> let's go over where we were 09:05 -!- bitcoinmuc [bc62dd33@dslb-188-098-221-051.188.098.pools.vodafone-ip.de] has quit [Quit: Connection closed] 09:05 < felixweis> minisketch helps every bitcoiner to get a GF(2)! 09:05 -!- bitcoinmuc [bc62dd33@dslb-188-098-221-051.188.098.pools.vodafone-ip.de] has joined #bitcoin-core-pr-reviews 09:06 < sipa> we're working in a finite field, which is like numbers, but addition and subtraction multiplication and division are all defined in a weird way 09:06 < glozow> i was in the minisketchy part of town and someone made me do a set reconciliation with the bills in my wallet 09:06 < sipa> a+b and a-b are the same thing 09:06 -!- Murch [~murch@gateway/shell/hashbang/x-wlcswajepjogalnc] has joined #bitcoin-core-pr-reviews 09:06 -!- nehan [~nehan@41.213.196.104.bc.googleusercontent.com] has joined #bitcoin-core-pr-reviews 09:06 -!- raj_149 [~quassel@ec2-18-217-191-36.us-east-2.compute.amazonaws.com] has joined #bitcoin-core-pr-reviews 09:07 < Guest8267> XOR 09:07 < pinheadmz> lets all just pay attention to sipa. if you miss anything, its really easy and fast to get whatever you missed from someone else 09:07 < sipa> and then we define "sketches" of a set {a,b,c} as just the list {a+b+c, a^3+b^3+c^3, a^5+b^5+c^5, ...} 09:07 < sipa> up to its capacity 09:07 < glozow> welcome to the frobenius hospital, we only treat odd syndromes because the even ones can be cured by squaring the odd ones 09:07 < jnewbery> thanks glozow 09:07 < glozow> ok sorree i'm done now 09:08 < jonatack> 🤣 09:08 < sipa> today we'll let Berlekamp be our guide in tracing a euclidean ring through the galois fields, in the hope of finding some hidden roots... 09:08 -!- generic [~generic@195.181.160.175.adsl.inet-telecom.org] has joined #bitcoin-core-pr-reviews 09:09 < sipa> and in general set reconciliation works by sending such a sketch, letting the other side "add" (or subtract, same thing) from it their own sketch 09:10 < sipa> which results in a sketch of the symmetric difference of the two parties' sets 09:11 < sipa> as you can see that say Alice has {a,b} and Carol has {b,c}, the sketches are {a+b,a^3+b^3,...} and {b+c,b^3+c^3,...} and pairwise adding those gives you {a+c,a^3+c^3,...}, the sketch of {a,c} 09:11 < sipa> makes sense? 09:12 < jnewbery> 👍 09:12 < pinheadmz> very cool yes 09:12 < sipa> now, the hard part is... given this {a+c,a^3+c^3,...} sketch, find {a,c} again 09:13 < larryruane_> so (a+b) + (b+c) = a+2b+c = a+c ? 09:13 < pinheadmz> larryruane_ yes bc + and - cancel out like XOR! 09:13 < sipa> we've already used the Berlekamp-Massey algorithm to turn this sequence into a polynomial that generates the sequence, which in our case would be (1+ax)*(1+cx) 09:13 < pinheadmz> er I shoudl say +b and +b cancel out 09:13 < sipa> larryruane_: yes, characteristic 2 field, so a+a = 0 09:13 -!- brunog [bbb72bc8@187.183.43.200] has joined #bitcoin-core-pr-reviews 09:14 < sipa> but of course we don't get the polynomial in that form, we get just the coefficients of it: [1, a+c, ac] 09:15 < sipa> and if we had more terms, it'd be even more complex 09:16 < sipa> for 3 terms it'd be [1, a+b+c, ab+bc+ac, abc] etc 09:16 < pinheadmz> Berlekamp-Massey turns this: {a+c,a^3+c^3,...} into this: (1+ax)*(1+cx) ? 09:16 < sipa> indeed 09:16 < sipa> and it does so regardless of how big your sketch was 09:17 -!- gmaxwell [~procyonid@wikimedia/KatWalsh/x-0001] has joined #bitcoin-core-pr-reviews 09:17 < sipa> that polynomial defines the pattern underlying the infinite sequence of {a+c,a^3+c^3,a^5+c^5,a^7+c^7,...} 09:18 < sipa> so we work in the "sketch" form because there it's easy to use the cancelling-out property 09:18 < sipa> and that's what we send 09:18 < sipa> but we then use BM to discover the pattern behind it, and that pattern (the polynomial) helps us find what the actual input terms are 09:19 < pinheadmz> (1+ax)*(1+cx) = 1 + cx + ax + ac(x^2) ? 09:19 < sipa> there is a bit deeper explanation here: https://github.com/sipa/minisketch/blob/master/doc/math.md 09:19 -!- tkc [~tkc@162.154.243.234] has quit [Read error: Connection reset by peer] 09:19 < sipa> yes, 1 + (a+c)x + (ac)x^2, so BM finds the coefficients [1,a+c,ac] 09:19 -!- tkc [~tkc@162.154.243.234] has joined #bitcoin-core-pr-reviews 09:19 < sipa> what are our next steps? 09:19 < pinheadmz> oh right (a+c)x 09:20 < sipa> assuming we actually want to find a and c 09:20 -!- gmaxwell [~procyonid@wikimedia/KatWalsh/x-0001] has left #bitcoin-core-pr-reviews [] 09:20 < glozow> factor it 09:20 < sipa> yeah, of course 09:20 < lightlike> check that it has n roots and can be completely factored 09:21 < sipa> indeed, that too 09:21 < sipa> we could use a fully-fledged factoring algorithm like cantor-zassenhaus, but we don't actually care about factoring it 09:21 < sipa> we want to find its roots 09:21 < sipa> which is the same as saying: factoring into 1st degree factors 09:22 < sipa> but if the polynomial somehow can't be factored fully into 1st degree factors, or those factors aren't all unique, we don't really care at all 09:22 < felixweis> because it can't be fully decoded 09:22 < felixweis> all or nothing 09:23 < sipa> right, we know that if that polynomial is the result of BM on a sketch of sufficient size, it will be factorizable into distinct 1st degree factors 09:23 < sipa> and so we can actually use a significantly simpler algorithm that just finds the roots, and we can even use one that only works if all roots are distinct 09:24 < sipa> but we do need to check ahead of time that this is the case, as the algorithm we'll use would run into an infinite loop or otherwise behave incorrectly if it isn't 09:24 < sipa> how did we do that? 09:24 < sipa> we briefly discussed it last time 09:24 < lightlike> if we find that the polynomial isn't factorizable, can we deduce that the sketch size was too small? or could that have other causes as well? 09:24 < sdaftuar> sipa: under what circumstances would BM give you a polynomial with duplicate roots that live in the field? 09:25 < sipa> lightlike: yeah, it must mean that 09:25 < glozow> use `poly_frobeniusmod` - compute x^{2^b} mod poly, which should be exactly x if it has unique roots 09:26 -!- novakboskov [~user@142-79-194-165.starry-inc.net] has joined #bitcoin-core-pr-reviews 09:26 < felixweis> I was able to generate a sketch(8,4) that decodes 5 numbers. whats the origin of this? 09:26 < sipa> sdaftuar: if the list (sketch) appears to have a polynomial with repeated roots as shortest LFSR that generates it 09:27 < sipa> i believe that e.g. [1,0,1,0,1,0,1,0,...] has (x^2 + 1) as LFSR 09:27 < sipa> which has double root 1 09:27 < sdaftuar> thanks, will ponder 09:27 < sipa> given that we start from a set where every element can only occur once, that must mean our sketch was just too small 09:28 < sipa> glozow: indeed, why? 09:29 < pinheadmz> sipa guess: some element wrapped around the modulus? and repeated some lower element? 09:29 < glozow> in an order q galois field, x^q - x always has every field element as roots, so if the polynonmial does too, then x^q = x mod poly 09:29 < sipa> right, or in other words: we want to know if poly is a divisor of x^q - x 09:30 < sipa> and if that's the case, (x^q - x) mod poly = 0 09:30 < sipa> and if poly has degree > 1, that's the same as x^q mod poly = x 09:30 < sipa> because (x^q - x) = x*(x+1)*(x+2)*(x+3)*...*(x+(q-1)) 09:30 < sipa> (i.e. it's the product of all possible 1st degree factors, and thus has every element of the field exactly once as root) 09:31 < sipa> ok, moving on! 09:31 < glozow> yeet 09:31 < sipa> actually finding the root 09:31 < sipa> s 09:31 < sipa> again: we're really trying to find 1st degree factors of our polynomial, but we *know* ahead of time that it factors completely, without any duplicates 09:32 < lightlike> do we do this check only as an optimization to save time, or because the root finding algorithm could run indefinitely? 09:32 < glozow> both? 09:32 < sipa> lightlike: done naively, it could run indefinitely 09:32 < sipa> ok 09:32 < sipa> what's the trace function? 09:32 < sipa> (because it's the Berlekamp Trace algorithm, there must be a trace, right?) 09:34 < sipa> tr(x) = x + x^2 + x^4 + x^8 + ... + x^(q/2) 09:34 < sipa> is the trace function for our field, w.r.t. GF(2) 09:34 < sipa> in general, a trace function is a function that maps elements of some bigger structure to a smaller one 09:34 < glozow> I'm not 100% clear on this. So the Trace function gives us a GF(2)-linear map from the polynomials to GF(2)? 09:35 < sipa> it maps every GF(2^b) element to a GF(2) element, in our case 09:35 < sipa> and more precisely, it maps exactly half of them to 0 and the other half to 1 09:35 < glozow> right, it'd have to 09:35 < sipa> you can see that this is the case by computing what tr(x) * (1 + tr(x)) is 09:37 < sipa> this also means that for any field element a (not 0), tr(a*x) also has this property 09:37 < sipa> it maps half of the elements to 0, and the other half to 1... but which half that is depends on a 09:38 < sipa> so we start by picking a random a, and trying to separate the roots from poly(x) into the ones for which tr(a*x)=0 and the ones for which tr(a*x)=1 09:38 < sipa> and then do that recursively with different a values, until everything is split into 1st degree factors 09:39 < sipa> what do you know about poly(x) mod tr(a*x) ? 09:39 < glozow> wait sorry, so the Trace function is defined on GF(2^b), how do we apply it to the polynomial itself? 09:39 < sipa> we'll get there 09:40 < sipa> tr(a*x) is a polynomial in x 09:40 < sipa> if you think about it symbolically 09:40 < sipa> it's a*x + (a^2)*x^2 + (a^4)*x^4 + ... 09:41 < sipa> right? 09:41 < glozow> right, mhm 09:41 < sipa> now: think about what a modulus means: 09:41 < sipa> if r(x) = poly(x) mod tr(x), that means that r(x) equals poly(x) + somefunction(x)*tr(x) 09:42 < sipa> in the same way that 19 mod 8 = 3 means that 3 = 19 + (some number)*8 09:42 < sipa> (where some number here specifically is -2) 09:42 < sipa> for polynomial modulus it's the same, except it's now some unknown polynomial 09:43 < sipa> plz ask questions if things aren't clear :) 09:43 < glozow> is that polynomial = gcd(poly, trace)? 09:43 < sipa> no no, no gcd yet 09:43 < sipa> just a simple modulus 09:43 < sipa> this is the definition of a modulus 09:44 < glozow> okok ye 09:44 < sipa> or even the definition of division as you learned it in high school probably: when computing a/b, you find a-q*b=r 09:44 < sipa> quotient and residue 09:45 < sipa> the modulus operation is finding the residue and ignoring the quotient 09:45 < glozow> ye 09:45 < sipa> so! 09:45 < sipa> if r(x) = poly(x) mod tr(x), that must mean that r(x) = poly(x) + quotient(x)*tr(x) 09:46 < sipa> but we know tr(x) is 0 for half of the field 09:46 < sipa> (now thinking about concrete x values) 09:46 -!- brunog [bbb72bc8@187.183.43.200] has quit [Quit: Connection closed] 09:46 < sipa> this means that r(x) must have all roots that poly(x) has which coincide with roots of tr(x) (and that's half the field) 09:47 < sipa> because evaluating r(x) = poly(x) + quotient(x)*tr(x) in such an x just gives r(x) = 0 + quotient(x)*0 09:47 -!- Talkless [~Talkless@mail.dargis.net] has joined #bitcoin-core-pr-reviews 09:47 < glozow> r(x)'s roots = shared roots of poly(x) and tr(x) 09:47 < glozow> ? 09:47 < sipa> it must have _at least_ those roots 09:47 < sipa> it can have others 09:48 < glozow> mm okay 09:48 < sipa> but to weed those out, you use a gcd 09:48 < sipa> the (polynomial) gcd of r(x) and poly(x) gives you something which exactly has the shared roots of poly(x) and tr(x) 09:49 < sipa> gcd for polynomials = literally a way to computing the polynomial consisting of all shared factors 09:49 < amiti> if tr(x) is 0, how do we know that poly(x) is 0? 09:49 < sipa> amiti: we don't, we're trying to find that 09:50 < amiti> oh, I see 09:50 < sipa> it's just the case that for all values v for which tr(v)=0, we know that poly(x) mod tr(x), evaluated in v, also gives 0 09:51 < sipa> if v is a root of poly(x) 09:51 < sipa> and thus poly(x) mod tr(x) must be a polynomial with v as root if it's a root of both tr(x) and poly(x) 09:51 < eoin> what does tr(x) mean? 09:51 < glozow> trace function evaluated on x 09:51 < sipa> 09:34:02 < sipa> tr(x) = x + x^2 + x^4 + x^8 + ... + x^(q/2) 09:52 < sipa> we don't know anything about the other roots of (poly(x) mod tr(x)), though 09:52 < sipa> but after doing a gcd with poly(x), you get a polynomial with exactly the shared roots of poly(x) and tr(x) 09:52 < eoin> gcd? 09:52 < sipa> greatest common divisor 09:53 < eoin> is it greatest common denominator? 09:53 < sipa> no 09:54 < sipa> we're not working with numbers but with polynomials 09:54 < sipa> divisor is generic 09:54 < generic> i am? ;P 09:54 < sipa> hahaha 09:54 < jonatack> https://en.wikipedia.org/wiki/Polynomial_greatest_common_divisor 09:55 < sipa> so: we're almost done! 09:55 < sipa> we have f1(x) = gcd(r(x),poly(x)), which is the polynomial with all shared roots of poly(x) and tr(x) 09:55 < sipa> and f2(x) = poly(x) / f1(x), which has all the other roots 09:55 < sipa> f1,f2 are a factorization of poly 09:56 < sipa> f1 has all the roots for which tr(x)=0, f2 has all the roots for which tr(x)=1 09:57 < sipa> so then you can repeat the process, but with a different a (i've been writing tr(x) everywhere, but i really meant tr(a*x)) 09:57 < sipa> to split f1 and f2 up further 09:57 < sipa> until you hit 1st degree polynomials, and if you have a 1st degree polynomial (x+m), its root is kind of obvious 09:58 < sipa> ok, question! what would happen if there was a duplicate root? 09:58 < sipa> and you'd naively do this? 09:59 < amiti> you'd never hit the 1st degree polynomial, but you'd keep repeating the process tryna get there? 09:59 < glozow> you wouldn't end up with linear factors? 09:59 < sipa> yeah, say you have x^2+1, which has duplicate root 1 09:59 < sipa> if tr(a*1)=0, you'd always get f1(x)=x^2+1 and f2(x)=1 10:00 < sipa> if tr(a*1)=1, you'd always get f1(x)=1 and f2(x)=x^2+1 10:00 < sipa> so both factors would always land on the same side of the split 10:00 < sdaftuar> since you use a special lookup for quadratics anyway, this would only be an issue if you had a triple (or more) root -- is that right? 10:00 < sipa> indeed 10:00 < glozow> why doesn't the loop halt after trying 2^field_size times? would that do anything? 10:00 < sipa> glozow: ah! 10:01 < sipa> well, if you pick the a values randomly, you can't ever stop 10:01 < sipa> it turns out, you can do much better than picking them randomly 10:01 < glozow> is this the randv = gf.mul2(randv) line? 10:01 < sipa> yeah 10:01 < sipa> if you pick (a, 2a, 4a, 8a, 16a, ..., {q/2}a), you'll always find every root 10:02 < jonatack> set {2^i*a for i=0..fieldsize-1} 10:02 < sipa> which just needs b (=log2(q)) steps 10:02 < sipa> and you could indeed just stop after recursing b times 10:02 < sipa> and if you do that, the frobenius check at the start just becomes an optimization 10:03 < sipa> those a values are optimally orthogonal in a way 10:03 < sipa> i discovered that, and was very proud of it, because i couldn't find any implementations of BTA that used this 10:03 < sipa> until i learned that it's actually mentioned in berlekamp's 1967 paper that introduced the algorithm 10:04 < amiti> =P 10:04 * sdaftuar is still impressed 10:05 < sipa> another optimization we have: if you've computed tr(a*x) mod poly(x), you can compute x^q mod poly(x) from that too 10:05 -!- eoin [3325648b@51.37.100.139] has left #bitcoin-core-pr-reviews [] 10:06 < sipa> if r(x) = tr(a*x) mod poly(x), then r(x)*(r(x)+1) = (a*x)^q i believe (or (a*x)^q + (a*x), something like that 10:07 < sipa> and in the C++ code we use that to do the frobenius check simultaneously with the first recursion level of the factoring algorithm 10:08 -!- eoin [3325648b@51.37.100.139] has joined #bitcoin-core-pr-reviews 10:08 < sipa> sdaftuar: and yeah, with the explicit formula for 2nd degree polynomials, duplicate roots specifically is not a problem (we'd detect them when trying to solve the 2nd factor) 10:09 < sipa> but you could have irreducible 3rd degree polynomials too, for example 10:09 < sipa> it's not just duplicate roots that form a problem 10:09 < sdaftuar> right, makes sense 10:09 * jonatack clapping 👏 10:09 < sipa> https://github.com/sipa/minisketch/blob/master/src/sketch_impl.h#L170L202 10:10 < sipa> that explains how to do the frobenius check simultaneously with splitting 10:10 < sipa> randv there is what i've called a here 10:11 < felixweis> whats randv stand for? 10:11 < sipa> random value 10:11 < sipa> :) 10:11 < felixweis> ok 10:11 < eoin> what is BCH? 10:12 < sipa> eoin: Bose–Chaudhuri–Hocquenghem 10:12 < sipa> https://en.wikipedia.org/wiki/BCH_code 10:12 < jonatack> probably good to add this link to the log too: https://en.wikipedia.org/wiki/GF%282%29 10:12 -!- name [49e12c18@c-73-225-44-24.hsd1.wa.comcast.net] has joined #bitcoin-core-pr-reviews 10:13 < sipa> oh, i guess one last thing: we started from the polynomial (1+ax)(1+cx), and found its roots 1/a and 1/c 10:13 < sipa> but we want a and c 10:13 < sipa> a very simple trick helps with that: reverse the coefficients of polynomials before trying to find the roots 10:14 < sipa> roots of (a*x^3 + b*x^2 + c*x + d) = inverses of roots of (d*x^3 + c*x^2 + b*x + a) 10:14 < glozow> woah nice 10:14 < sipa> there also exists something called a batch inverse, where with 1 inverse + 3*n multiplications you can find the inverses of n elements at once 10:14 < sipa> but we don't even need it here 10:15 < sipa> inverses are many times more expensive than multiplications, fwiw 10:15 -!- mol_ [~mol@unaffiliated/molly] has quit [Remote host closed the connection] 10:15 < sipa> so... any questions? :) 10:15 < jonatack> sipa: trick used here? roots = poly_find_roots(list(reversed(poly)), self._gf) 10:15 < sipa> jonatack: yes 10:16 -!- mol_ [~mol@unaffiliated/molly] has joined #bitcoin-core-pr-reviews 10:16 < glozow> wait why is the roots of reversed = inverses of roots? 10:16 < sipa> aha! 10:16 < sipa> ok 10:16 < sipa> substitute y = 1/x 10:17 < sipa> so you start with a*x^3 + b*x^2 + c*x + d 10:17 < sipa> and get a*y^-3 + b*y^-2 + c*y^-1 + d 10:17 < sipa> now multiply everything with y^3 10:17 < glozow> ohhhhhhhh 10:17 < sipa> and you get a + b*y + c*y^2 + d*y^3 10:17 -!- bitcoinmuc [bc62dd33@dslb-188-098-221-051.188.098.pools.vodafone-ip.de] has quit [Quit: Connection closed] 10:18 < sipa> and doing so doesn't change the roots 10:18 < felixweis> nice 10:19 < glozow> this is true in general for polynomials? 10:19 < sipa> yes 10:19 < glozow> why didn't they teach this in school 10:19 < glozow> jeez 10:19 < sipa> haha 10:20 < sipa> what if 0 is one of the roots? 10:20 < sdaftuar> no constant term? 10:20 < sipa> indeed 10:20 < sdaftuar> probably shouldn't do that trick til you factor it out 10:20 < sipa> it still works actually 10:20 < sipa> but you get a polynomial of degree one less 10:21 < sipa> which excludes the infinity root 10:21 < sipa> thankfully, not a problem for us, because we know all our roots are nonzero 10:21 < sipa> oh, question: why did we need the property that we encode our set elements as nonzero field elements? 10:21 < felixweis> https://brilliant.org/discussions/thread/proof-for-inverse-roots-polynomial/ 10:22 < jonatack> so in the C++ code: std::reverse(poly.begin(), poly.end()); 10:22 < sipa> jonatack: indeed 10:24 < glozow> if they're zero, 10:24 < sipa> what would the sketches be for sets {a} and {a,0} ? 10:24 < glozow> they'd be the same :O 10:24 < felixweis> same 10:24 < sipa> exactly 10:25 < felixweis> adding 0 is a NOP 10:25 < sipa> and it's kind of related to this inversion at the end: in the BM representation, the elements become inverses of the roots 10:25 < sipa> but 0 can't be the inverse of a root 10:26 < sipa> it'd be possible to just add 1 bit to every sketch to indicate "contains 0", and xor that along with everything else 10:26 < sipa> but just avoiding 0 is easier 10:26 < sdaftuar> sipa: so are you saying it's impossible for BM to spit out a polynomial with 0 as a root? or just that it means the sketch obviously won't decode? 10:26 -!- name [49e12c18@c-73-225-44-24.hsd1.wa.comcast.net] has quit [Quit: Connection closed] 10:26 < glozow> the sketches would still work, but you wouldn't be able to reconcile an element represented as 0? 10:27 < sipa> sdaftuar: i believe that's the case yes, BM 10:27 < sipa> iirc BM will always produce a polynomial with constant term 1 10:28 < sipa> not entirely sure, but even if not, it can't even have a constant term 0 10:28 < sipa> because then by definition it's not a minimal LFSR 10:29 < sdaftuar> ah 10:29 < jonatack> https://en.wikipedia.org/wiki/Linear_feedback_shift_register for the log 10:29 < glozow> is that everything for today sipa? :) 10:30 < sipa> seems like a good place to end :) 10:30 < glozow> #endmeeting 10:30 < glozow> thank you sipa ^_^ 10:30 < felixweis> overall structure seems is a lot less foggy now but will need to reread this a few times to approximate my understanding. thanks for your time, sipa! also thanks for those scanned handwriting notes added after the last session very helpful. 10:30 < pinheadmz> yeah tahnks sipa and glozow 10:30 < fodediop> thank you sipa. thank you glozow 10:30 < sipa> yw! 10:30 < tkc> yes thank you. tough intro! 10:30 < pinheadmz> i think irc chats arent working for me to understand this stuff, i need more fundamental work in how to operate on polynomials 10:30 < jonatack> thanks! (fog slightly lifting) 10:30 < glozow> i didn't do anything :joy 10:31 < glozow> 😂 * 10:31 -!- fodediop [~fode@41.214.81.87] has quit [Quit: WeeChat 3.0] 10:31 < amiti> thank you sipa! this was v helpful to help me understand the broad strokes of how the picture fits together 10:31 < sipa> pinheadmz: if it's too abstract, perhaps it helps to look at the python code that does the polynomial operations? 10:32 < pinheadmz> good idea 10:32 < sipa> because it all boils down to working on lists of numbers (which represent the coefficients of the polynomials) 10:32 < emzy> thank you sipa 10:32 < tkc> yes-i think that is a good suggestion. 10:32 < felixweis> i just saw the c++ code has even more comments than the python version but you'll need to do some code mapping 10:33 < sipa> yeah, how do we go from here? do people want review club(s) on the C++ code? 10:33 < jonatack> yes 10:33 < glozow> would love one! 10:33 < glozow> did you already open the minisketch pr to core? 10:33 * jonatack have log, will upload 10:34 < felixweis> if so only in a few weeks please. will need to do some catching on the python impl first. 10:34 < amiti> yeah I'd be game for a review club on the c++ code, as long as it's spaced out 10:34 < amiti> hahhaha yeah exactly, I have a lot of math to prove to myself :) 10:35 < glozow> I'm next week, and then jnewbery and then Marco i think 10:35 < sipa> glozow: i have not yet 10:35 < glozow> so it'd be at least a few weeks 10:35 < sipa> all good by me 10:36 -!- tkc [~tkc@162.154.243.234] has left #bitcoin-core-pr-reviews ["Leaving"] 10:36 < glozow> :D 10:36 < felixweis> great. minisketch is very facinating! and its a good impetus to undust some old math books at least for me 10:37 -!- shaunsun [shaunsun@gateway/vpn/privateinternetaccess/shaunsun] has quit [Ping timeout: 276 seconds] 10:37 < sipa> minisketch started as an attempt to get an implementation of NTL's algorithms needed for erlay that wasn't GPL 10:37 < sipa> NTL is sort of the library people use for low-level finite field arithmetic stuff 10:38 < sipa> (and it was used by the authors of the PinSketch paper for their implementation) 10:38 -!- shaunsun [shaunsun@gateway/vpn/privateinternetaccess/shaunsun] has joined #bitcoin-core-pr-reviews 10:38 < sipa> so i learned most of this just from reading the NTL source code... 10:38 -!- kouloumos [5d6d8fd3@93-143-211.internethome.cytanet.com.cy] has quit [Quit: Connection closed] 10:38 < sipa> you can't find much about BTA online 10:39 < sipa> the standard algorithm for factoring polynomials over finite fields is https://en.wikipedia.org/wiki/Cantor%E2%80%93Zassenhaus_algorithm but as described there, it doesn't work for GF(2^b) fields 10:39 -!- andozw [43056ef6@67-5-110-246.spok.qwest.net] has quit [Quit: Connection closed] 10:41 < glozow> i took an algebra class in my last semester of college so i could be a better bitcoiner, best decision ever 10:42 < felixweis> 👍 10:42 < sipa> haha 10:44 < jonatack> "today we'll let Berlekamp be our guide in tracing a euclidean ring through the galois fields, in the hope of finding some hidden roots..." 10:45 < jonatack> ^ great stuff 10:45 < eoin> there doesn't seem to be much activity on #bitcoin-core-dev 10:45 < sipa> eoin: it's bursty 10:45 < jonatack> https://bitcoincore.reviews/minisketch-26-2#meeting-log 🍰 10:46 < eoin> what does 'bursty' mean? 10:46 < pinheadmz> eoin theres regular meetings 10:46 < eoin> when are they? 10:47 < sipa> eoin: sometimes there is a lot of activity, sometimes there is none for extended periods of time 10:47 < pinheadmz> thu 19:00 GMT I think ...? 10:47 < jonatack> eoin: see https://github.com/jonatack/bitcoin-development/blob/master/bitcoin-core-dev-irc-meetings.txt 10:48 < pinheadmz> jonatack im very happy that doc has an emoji list 10:48 < jonatack> pinheadmz: 👍 10:50 -!- novakboskov [~user@142-79-194-165.starry-inc.net] has quit [Ping timeout: 264 seconds] 11:01 -!- eoin [3325648b@51.37.100.139] has quit [Quit: Connection closed] 11:15 -!- generic [~generic@195.181.160.175.adsl.inet-telecom.org] has quit [Ping timeout: 245 seconds] 11:25 -!- Guest8267 [92732bd1@146.115.43.209] has quit [Quit: Connection closed] 11:50 -!- shaunsun [shaunsun@gateway/vpn/privateinternetaccess/shaunsun] has quit [Ping timeout: 276 seconds] 11:53 -!- shaunsun [shaunsun@gateway/vpn/privateinternetaccess/shaunsun] has joined #bitcoin-core-pr-reviews 11:59 -!- jonatack_ [~jon@37.170.222.46] has joined #bitcoin-core-pr-reviews 12:03 -!- jonatack [~jon@37.172.59.183] has quit [Ping timeout: 260 seconds] 12:14 -!- Talkless [~Talkless@mail.dargis.net] has quit [Quit: Konversation terminated!] 12:33 -!- luke-jr [~luke-jr@unaffiliated/luke-jr] has quit [Ping timeout: 260 seconds] 12:57 -!- musdom [~Thunderbi@202.184.0.102] has joined #bitcoin-core-pr-reviews 13:19 -!- rjected [~weechat-h@natp-128-119-202-34.wireless.umass.edu] has quit [Quit: WeeChat 3.0.1] 13:20 -!- rjected [~weechat-h@natp-128-119-202-34.wireless.umass.edu] has joined #bitcoin-core-pr-reviews 13:23 -!- shaunsun_ [shaunsun@gateway/vpn/privateinternetaccess/shaunsun] has joined #bitcoin-core-pr-reviews 13:25 -!- gleb [~gleb@178.150.137.228] has quit [Read error: Connection reset by peer] 13:25 -!- gleb [~gleb@178.150.137.228] has joined #bitcoin-core-pr-reviews 13:26 -!- shaunsun [shaunsun@gateway/vpn/privateinternetaccess/shaunsun] has quit [Ping timeout: 276 seconds] 13:33 -!- Netsplit *.net <-> *.split quits: qubenix, aqua42, hugohn, brikk, tuxcanfly, kcalvinalvin, ryanofsky 13:34 -!- Netsplit over, joins: qubenix, hugohn, kcalvinalvin, tuxcanfly, ryanofsky, brikk, aqua42 13:36 -!- CubicEarth [~CubicEart@c-67-168-1-172.hsd1.wa.comcast.net] has quit [Ping timeout: 264 seconds] 13:38 -!- CubicEarth [~CubicEart@c-67-168-1-172.hsd1.wa.comcast.net] has joined #bitcoin-core-pr-reviews 13:52 -!- shaunsun__ [shaunsun@gateway/vpn/privateinternetaccess/shaunsun] has joined #bitcoin-core-pr-reviews 13:52 -!- shaunsun_ [shaunsun@gateway/vpn/privateinternetaccess/shaunsun] has quit [Ping timeout: 264 seconds] 13:53 -!- luke-jr [~luke-jr@unaffiliated/luke-jr] has joined #bitcoin-core-pr-reviews 14:07 -!- jb55 [~jb55@gateway/tor-sasl/jb55] has quit [Ping timeout: 268 seconds] 14:12 -!- jb55 [~jb55@gateway/tor-sasl/jb55] has joined #bitcoin-core-pr-reviews 15:15 -!- musdom [~Thunderbi@202.184.0.102] has quit [Ping timeout: 245 seconds] 15:45 -!- davterra [~davterra@gateway/tor-sasl/tralfaz] has quit [Quit: Leaving] 15:45 -!- davterra [~davterra@gateway/tor-sasl/tralfaz] has joined #bitcoin-core-pr-reviews 16:00 -!- mol_ [~mol@unaffiliated/molly] has quit [Read error: Connection reset by peer] 16:01 -!- larryruane_ [uid473749@gateway/web/irccloud.com/x-lmsrftnnjdmdxmiz] has quit [Quit: Connection closed for inactivity] 16:04 -!- jeremyrubin [~jr@024-176-247-182.res.spectrum.com] has joined #bitcoin-core-pr-reviews 16:41 -!- mol [~mol@unaffiliated/molly] has joined #bitcoin-core-pr-reviews 16:41 -!- luke-jr [~luke-jr@unaffiliated/luke-jr] has quit [Read error: Connection reset by peer] 16:48 -!- luke-jr [~luke-jr@unaffiliated/luke-jr] has joined #bitcoin-core-pr-reviews 16:55 -!- mol_ [~mol@unaffiliated/molly] has joined #bitcoin-core-pr-reviews 16:59 -!- mol [~mol@unaffiliated/molly] has quit [Ping timeout: 276 seconds] 17:01 -!- d [~davterra@gateway/tor-sasl/tralfaz] has joined #bitcoin-core-pr-reviews 17:01 -!- d is now known as Guest84735 17:02 -!- davterra [~davterra@gateway/tor-sasl/tralfaz] has quit [Remote host closed the connection] 17:14 -!- jeremyrubin [~jr@024-176-247-182.res.spectrum.com] has quit [Ping timeout: 276 seconds] 17:15 -!- Guest84735 is now known as davterra 17:49 -!- lightlike [~lightlike@p200300c7ef119f002c09a758dd7fa4c8.dip0.t-ipconnect.de] has quit [Remote host closed the connection] 18:02 -!- vasild [~vd@gateway/tor-sasl/vasild] has quit [Ping timeout: 268 seconds] 18:04 -!- musdom [~Thunderbi@202.184.0.102] has joined #bitcoin-core-pr-reviews 18:29 -!- belcher_ [~belcher@unaffiliated/belcher] has joined #bitcoin-core-pr-reviews 18:32 -!- belcher [~belcher@unaffiliated/belcher] has quit [Ping timeout: 260 seconds] 18:39 -!- davterra [~davterra@gateway/tor-sasl/tralfaz] has quit [Quit: Leaving] 19:03 -!- virtu [~virtu@gateway/tor-sasl/virtu] has quit [Ping timeout: 268 seconds] 19:05 -!- virtu [~virtu@gateway/tor-sasl/virtu] has joined #bitcoin-core-pr-reviews 19:18 -!- luke-jr [~luke-jr@unaffiliated/luke-jr] has quit [Read error: Connection reset by peer] 19:18 -!- luke-jr [~luke-jr@unaffiliated/luke-jr] has joined #bitcoin-core-pr-reviews 19:34 -!- emzy [~quassel@unaffiliated/emzy] has quit [Ping timeout: 272 seconds] 19:43 -!- emzy [~quassel@2a01:4f8:192:628a::83] has joined #bitcoin-core-pr-reviews 20:09 -!- musdom [~Thunderbi@202.184.0.102] has quit [Ping timeout: 245 seconds] 20:46 -!- shesek [~shesek@unaffiliated/shesek] has quit [Remote host closed the connection] 20:46 -!- shesek [~shesek@164.90.217.137] has joined #bitcoin-core-pr-reviews 20:46 -!- shesek [~shesek@164.90.217.137] has quit [Changing host] 20:46 -!- shesek [~shesek@unaffiliated/shesek] has joined #bitcoin-core-pr-reviews 20:53 -!- shaunsun__ [shaunsun@gateway/vpn/privateinternetaccess/shaunsun] has quit [Ping timeout: 264 seconds] 20:54 -!- shaunsun [shaunsun@gateway/vpn/privateinternetaccess/shaunsun] has joined #bitcoin-core-pr-reviews 21:24 -!- shaunsun [shaunsun@gateway/vpn/privateinternetaccess/shaunsun] has quit [Ping timeout: 260 seconds] 22:17 -!- jadi [~jadi@62.102.137.156] has joined #bitcoin-core-pr-reviews 22:43 -!- jadi [~jadi@62.102.137.156] has quit [Remote host closed the connection] 22:49 -!- jadi [~jadi@62.102.137.156] has joined #bitcoin-core-pr-reviews 23:13 -!- seven_ [~seven@cpe-90-157-197-248.static.amis.net] has joined #bitcoin-core-pr-reviews 23:15 -!- jadijadi [~jadi@62.102.137.156] has joined #bitcoin-core-pr-reviews 23:16 -!- jadi [~jadi@62.102.137.156] has quit [Ping timeout: 265 seconds] 23:20 -!- jadi [~jadi@62.102.137.156] has joined #bitcoin-core-pr-reviews 23:22 -!- jadijadi [~jadi@62.102.137.156] has quit [Ping timeout: 245 seconds] 23:31 -!- jadijadi [~jadi@62.102.137.156] has joined #bitcoin-core-pr-reviews 23:35 -!- jadi [~jadi@62.102.137.156] has quit [Ping timeout: 260 seconds] 23:40 -!- jonatack_ [~jon@37.170.222.46] has quit [Ping timeout: 260 seconds]