Skip to content
Snippets Groups Projects
Commit 9bff2987 authored by Regis Blanc's avatar Regis Blanc
Browse files

indepence of coins

parent 49a2f1e3
No related branches found
No related tags found
No related merge requests found
...@@ -8,6 +8,7 @@ object Coins { ...@@ -8,6 +8,7 @@ object Coins {
*/ */
case class CoinDist(pHead: BigInt, pTail: BigInt) case class CoinDist(pHead: BigInt, pTail: BigInt)
case class CoinsJoinDist(hh: BigInt, ht: BigInt, th: BigInt, tt: BigInt)
def isUniform(dist: CoinDist): Boolean = { def isUniform(dist: CoinDist): Boolean = {
require(isDist(dist)) require(isDist(dist))
...@@ -17,6 +18,26 @@ object Coins { ...@@ -17,6 +18,26 @@ object Coins {
def isDist(dist: CoinDist): Boolean = def isDist(dist: CoinDist): Boolean =
dist.pHead >= 0 && dist.pTail >= 0 && (dist.pHead > 0 || dist.pTail > 0) dist.pHead >= 0 && dist.pTail >= 0 && (dist.pHead > 0 || dist.pTail > 0)
def isDist(dist: CoinsJoinDist): Boolean =
dist.hh >= 0 && dist.ht >= 0 && dist.th >= 0 && dist.tt >= 0 &&
(dist.hh > 0 || dist.ht > 0 || dist.th > 0 || dist.tt > 0)
def join(c1: CoinDist, c2: CoinDist): CoinsJoinDist =
CoinsJoinDist(
c1.pHead*c2.pHead,
c1.pHead*c2.pTail,
c1.pTail*c2.pHead,
c1.pTail*c2.pTail)
def firstCoin(dist: CoinsJoinDist): CoinDist =
CoinDist(dist.hh + dist.ht, dist.th + dist.tt)
def secondCoin(dist: CoinsJoinDist): CoinDist =
CoinDist(dist.hh + dist.th, dist.ht + dist.tt)
def isIndependent(dist: CoinsJoinDist): Boolean =
join(firstCoin(dist), secondCoin(dist)) == dist
//sum modulo: face is 0, tail is 1 //sum modulo: face is 0, tail is 1
def sum(coin1: CoinDist, coin2: CoinDist): CoinDist = { def sum(coin1: CoinDist, coin2: CoinDist): CoinDist = {
require(isDist(coin1) && isDist(coin2)) require(isDist(coin1) && isDist(coin2))
...@@ -26,6 +47,14 @@ object Coins { ...@@ -26,6 +47,14 @@ object Coins {
) )
} }
def sum(dist: CoinsJoinDist): CoinDist = {
require(isDist(dist))
CoinDist(
dist.hh + dist.tt,
dist.ht + dist.th
)
}
def sumIsUniform1(coin1: CoinDist, coin2: CoinDist): Boolean = { def sumIsUniform1(coin1: CoinDist, coin2: CoinDist): Boolean = {
require(isDist(coin1) && isDist(coin2) && isUniform(coin1) && isUniform(coin2)) require(isDist(coin1) && isDist(coin2) && isUniform(coin1) && isUniform(coin2))
val dist = sum(coin1, coin2) val dist = sum(coin1, coin2)
...@@ -38,6 +67,26 @@ object Coins { ...@@ -38,6 +67,26 @@ object Coins {
isUniform(dist) isUniform(dist)
} holds } holds
def sumUniform3(coin1: CoinDist, coin2: CoinDist, coin3: CoinDist): Boolean = {
require(isDist(coin1) && isDist(coin2) && isDist(coin3) && isUniform(coin1))
val dist = sum(sum(coin1, coin2), coin3)
isUniform(dist)
} holds
def sumUniformWithIndependence(dist: CoinsJoinDist): Boolean = {
require(isDist(dist) && isIndependent(dist) && (isUniform(firstCoin(dist)) || isUniform(secondCoin(dist))))
val res = sum(dist)
isUniform(res)
} holds
//should find counterexample, indepenence is required
def sumUniformWithoutIndependence(dist: CoinsJoinDist): Boolean = {
require(isDist(dist) && (isUniform(firstCoin(dist)) || isUniform(secondCoin(dist))))
val res = sum(dist)
isUniform(res)
} holds
//sum of two non-uniform dices is potentially uniform (no result) //sum of two non-uniform dices is potentially uniform (no result)
def sumNonUniform1(coin1: CoinDist, coin2: CoinDist): Boolean = { def sumNonUniform1(coin1: CoinDist, coin2: CoinDist): Boolean = {
require(isDist(coin1) && isDist(coin2) && !isUniform(coin1) && !isUniform(coin2)) require(isDist(coin1) && isDist(coin2) && !isUniform(coin1) && !isUniform(coin2))
...@@ -52,12 +101,6 @@ object Coins { ...@@ -52,12 +101,6 @@ object Coins {
} //holds } //holds
def sumUniform3(coin1: CoinDist, coin2: CoinDist, coin3: CoinDist): Boolean = {
require(isDist(coin1) && isDist(coin2) && isDist(coin3) && isUniform(coin1))
val dist = sum(sum(coin1, coin2), coin3)
isUniform(dist)
} holds
def sumIsCommutative(coin1: CoinDist, coin2: CoinDist, coin3: CoinDist): Boolean = { def sumIsCommutative(coin1: CoinDist, coin2: CoinDist, coin3: CoinDist): Boolean = {
require(isDist(coin1) && isDist(coin2)) require(isDist(coin1) && isDist(coin2))
sum(coin1, coin2) == sum(coin2, coin1) sum(coin1, coin2) == sum(coin2, coin1)
...@@ -66,6 +109,6 @@ object Coins { ...@@ -66,6 +109,6 @@ object Coins {
def sumIsAssociative(coin1: CoinDist, coin2: CoinDist, coin3: CoinDist): Boolean = { def sumIsAssociative(coin1: CoinDist, coin2: CoinDist, coin3: CoinDist): Boolean = {
require(isDist(coin1) && isDist(coin2) && isDist(coin3)) require(isDist(coin1) && isDist(coin2) && isDist(coin3))
sum(sum(coin1, coin2), coin3) == sum(coin1, sum(coin2, coin3)) sum(sum(coin1, coin2), coin3) == sum(coin1, sum(coin2, coin3))
} holds } //holds
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment