Open Side Menu Go to the Top
Register
O8 nut low question O8 nut low question

07-27-2014 , 04:59 AM
How often does A2KK make the nut low?
How often does 234K make the nut low?
O8 nut low question Quote
07-27-2014 , 06:37 AM
These are just for A2345. See later post.

Quote:
Originally Posted by wheelflush
How often does A2KK make the nut low?
How often does 234K make the nut low?
3% and 6%.


[C(48,5) - 3*C(44,5) + C(3,2)*C(40,5) - C(3,3)*C(36,5)]/C(48,5)

≈ 3.00%


[C(48,5) - 2*C(44,5) - C(39,5) + C(40,5) + 2*C(35,5) - C(31,5)]/C(48,5)

≈ 5.95%

Those are by inclusion-exclusion. We take all boards, subtract the ones that are missing one of the cards we need, add back the ones that are missing 2, then subtract the ones that are missing 3. I verified these with scripts that count every board.


A2KK:

Code:
deck = c(1:13,101:113,1001:1013,10001:10013)
cards.out = c(1,2,13,113)
cards.need = c(3,4,5)

deck = deck[-which(deck %in% cards.out)]%%100
boards = combn(deck,5)
f = function(hand) all(cards.need %in% hand)
sum(apply(boards,2,f))/ncol(boards)
[1] 0.02996664


234K

Code:
deck = c(1:13,101:113,1001:1013,10001:10013)
cards.out = c(2,3,4,13)
cards.need.and = c(1,5)
cards.need.or = c(2,3,4)

deck = deck[-which(deck %in% cards.out)]%%100
boards = combn(deck,5)
f = function(hand) all(cards.need.and %in% hand) & any(cards.need.or %in% hand)
sum(apply(boards,2,f))/ncol(boards)
[1] 0.05950579

Last edited by BruceZ; 07-27-2014 at 05:18 PM. Reason: 5.96% -> 5.95%
O8 nut low question Quote
07-27-2014 , 01:54 PM
Thanks.
3% seems low.
O8 nut low question Quote
07-27-2014 , 02:03 PM
Quote:
Originally Posted by wheelflush
Thanks.
3% seems low.
Yea doesnt sound right
O8 nut low question Quote
07-27-2014 , 02:12 PM
Sorry, I thought you just wanted A2345 (I was half asleep when I did this). I'll be back with all the nut lows.
O8 nut low question Quote
07-27-2014 , 05:17 PM
This also isn't right because it counts too many boards with A or 2 on it.

I must have been thrown by wheelflush's name before.

It's 36.5% for A2KK, and I get 49.5% for A23K.

For the first one, I counted all boards that have at least 3 different ranks 3-8. For the second one, I counted all boards that had at least 3 different ranks 3-8 plus boards that have either an A or a 2 and at least 2 other ranks 4-8.

The first one I did both analytically and by examining each board, and they agree. The second one I just examined each board.

Here is the analytical expression for the first one where A-E are some cards between 3 and 8:

ABCxx: C(6,3)*4^3*C(24,2)
ABCCx: C(6,2)*4^2*4*C(4,2)*24
ABCCC: C(6,2)*4^2*4*C(4,3)
ABCDx: C(6,4)*4^4*24 +
ABCDD: C(6,3)*4^3*3*C(4,2) +
ABCBC: 6*4*C(5,2)*C(4,2)^2 +
ABCDE: C(6,5)*4^5)/C(48,5)
==============================
625344 / C(48,5) = 0.365206178342164


A2KK script:

Code:
deck = c(1:13,101:113,1001:1013,10001:10013)
cards.out = c(1,2,13,113)
deck = deck[-which(deck %in% cards.out)]%%100
boards = combn(deck,5)
f = function(hand) {
  hand = unique(hand)
  sum(hand <= 8 & hand > 2) >= 3
}
sum(apply(boards,2,f))/ncol(boards)
[1] 0.365206178342164


A23K script:

Code:
deck = c(1:13,101:113,1001:1013,10001:10013)
cards.out = c(1,2,3,13)
deck = deck[-which(deck %in% cards.out)]%%100
boards = combn(deck,5)
f = function(hand) {
  hand = unique(hand)
  sum(hand <= 8 & hand > 2) >= 3 | (any(c(1,2) %in% hand) & sum(hand <=8 & hand >= 4) >= 2)
}
sum(apply(boards,2,f))/ncol(boards)
[1] 0.495206458666218

Last edited by BruceZ; 07-28-2014 at 08:18 AM.
O8 nut low question Quote
07-27-2014 , 05:35 PM
That's better. I was also interested in comparing 234K.
O8 nut low question Quote
07-27-2014 , 07:33 PM
Same problem here.

I get 25.9% for 234K.

You always have to get an A because someone else might have one. Then if you play 23, you need at least 2 different ranks from 4-8. If you play 24 you need a 3 and at least 1 rank from 4-8, and if you play 34 you need a 2 and at least 1 rank from 4-8.

Code:
deck = c(1:13,101:113,1001:1013,10001:10013)
cards.out = c(2,3,4,13)
deck = deck[-which(deck %in% cards.out)]%%100
boards = combn(deck,5)
f = function(hand) {
  hand = unique(hand)
  1 %in% hand &
  ( sum(hand <= 8 & hand >= 4) >= 2 | (any(c(2,3) %in% hand) & sum(hand <=8 & hand >= 4) >= 1) )
}
sum(apply(boards,2,f))/ncol(boards)
0.258719246115176

Last edited by BruceZ; 07-28-2014 at 08:19 AM.
O8 nut low question Quote
07-28-2014 , 02:13 AM
Quote:
Originally Posted by BruceZ
For the first one, I counted all boards that have at least 3 different ranks 3-8.
I gave just a quick glance to your calculations and to your script and maybe I'm wrong, but the above doesn't appear to be correct. It seems that you are counting, for instance, A876Q type boards, against which A2KK do not qualify for the nut low (23xx would, forming 7632A instead of 8762A). The x in your calculations must be replaced by H (high cards), which are 18 instead of 24. The boards containing an A or a 2 against which A2KK makes the nut low are of the kind A2345, A345x, 2345x and similar.
O8 nut low question Quote
07-28-2014 , 06:35 AM
I took the "candidate" combos obtained by BruceZ, substracted all the combos containing either an Ace or a Two and then adding back A2345, 2345x and A345x type boards. This is what I got for the A2KK case:

Code:
deck <- c(1:13,101:113,1001:1013,10001:10013)
cards.out <- c(1,2,13,113)
deck <- deck[-which(deck %in% cards.out)]%%100
boards <- combn(deck,5)
f <- function(hand) {
  hand <- unique(hand)
  sum(hand <= 8 & hand > 2) >= 3
}

candidateBoards<-boards[,which(apply(boards,2,f))]

(ncol(candidateBoards)-length(which(apply(candidateBoards,2,function(x) any( 1:2 %in% x)))) +length(which(apply(candidateBoards,2,function(x) all(2:5 %in% x) || all(c(1,3:5) %in% x)))))/ncol(boards)
[1] 0.2479186

Last edited by nickthegeek; 07-28-2014 at 06:44 AM.
O8 nut low question Quote
07-28-2014 , 08:16 AM
Quote:
Originally Posted by nickthegeek
I gave just a quick glance to your calculations and to your script and maybe I'm wrong, but the above doesn't appear to be correct. It seems that you are counting, for instance, A876Q type boards, against which A2KK do not qualify for the nut low (23xx would, forming 7632A instead of 8762A). The x in your calculations must be replaced by H (high cards), which are 18 instead of 24. The boards containing an A or a 2 against which A2KK makes the nut low are of the kind A2345, A345x, 2345x and similar.
Ha, you're right. A2xx can fail to make the nuts if there is an A or 2 on the board because someone else can share your other hole card so he also has A2, and then sneak in there with a lower card of his own. So if there's an A or 2 on the board, there can't be any gaps to allow him to do that. Damn annoying low card games lol.* Probably obvious to people who play them. That's why I posted my assumptions. I counted what I was trying to count, but I shouldn't have been trying to count that.

*It happens in high card games too with the kicker. It's just that now we want our kickers to be lower rather than higher.

Last edited by BruceZ; 07-28-2014 at 09:01 AM.
O8 nut low question Quote
07-28-2014 , 10:26 AM
Here's the revised calculation for A2KK that agrees with nick's code. A-E are any ranks 3-8. A doesn't mean ace. 1 means ace.

ABCxx: C(6,3)*4^3*C(18,2)
ABCCx: C(6,2)*4^2*4*C(4,2)*18
ABCCC: C(6,2)*4^2*4*C(4,3)
ABCDx: C(6,4)*4^4*18 +
ABCDD: C(6,3)*4^3*3*C(4,2)
ABCBC: 6*4*C(5,2)*C(4,2)^2
ABCDE: C(6,5)*4^5)/C(48,5)
12345: 3*3*4^3
2345(6-Q): 3*4^3*30
1345(6-Q): 3*4^3*30
23345 or 23445 or 23455: 3*C(3,2)*4^2*C(4,2)
13345 or 13445 or 13455: 3*C(3,2)*4^2*C(4,2)
11345: C(3,2)*4^3
22345: C(3,2)*4^3
============================================
424512/C(48,5) = 0.247918593894542


A23K and 234K still need work.
O8 nut low question Quote
07-28-2014 , 01:10 PM
I have written a little code to evaluate the probability of any hand to make the nut low. The approach I took is the following:

- generate every possible board;
- for each board evaluate which are the couple of card that make the nut low (getNutLow function in the code);
- check if the given hand has that couple of cards (checkLow function).

The code I wrote is very slow, inelegant and probably buggy. I should (almost) feel ashamed of it I'm gonna post it anyway, just to show the results.

Code:
getNutLow<-function(board)
	{
	hand<-unique(board)
	low<-hand[which(hand<=8)]
	if (length(low)<3) return(NULL)
	below6<-hand[which(hand<6)]
	if (length(below6)==5) return(combn(5,2))
	if (length(below6)==4) return(matrix(c(rep(setdiff(1:5,low),4),sort(low)[1:4]),nrow=2,byrow=TRUE))
	matrix(setdiff(1:5,low)[1:2],ncol=1)
	}

checkLow<-function(lowMatrix,hand)
	{
	if (is.null(lowMatrix)) FALSE else any(apply(lowMatrix,2,function(x) all(x %in% hand)))
	}

getNutLowProb<-function(hand)
	{
	deck <- c(1:13,101:113,1001:1013,10001:10013)
	cards.out <- hand
	deck <- deck[-which(deck %in% cards.out)]%%100
	boards <- combn(deck,5,simplify=FALSE)
	hand<-hand%%100
	allNutLow<-lapply(boards,getNutLow)
	res<-vapply(allNutLow,checkLow,TRUE,hand=hand)
	sum(res)/length(boards)
	}
The results:

Code:
> getNutLowProb(c(1,2,13,113))
[1] 0.2479186
> getNutLowProb(c(1,2,3,13))
[1] 0.4313767
> getNutLowProb(c(2,3,4,13))
[1] 0.2250628
O8 nut low question Quote
07-28-2014 , 11:40 PM
That's definitely the way to do it. In what way to you feel it's probably buggy?

I tried speeding it up by getting rid of checkLow and just checking if the hand had the right cards inside getNutLow using a block if instead of returns, but that took almost twice as long. I thought it might be faster since would deal with each board when it has it instead of going through them all again, but it wasn't. Of course we could only generate boards with at least 3 low cards.

I learned from your code that I could use combn to generate a list and then use lapply/vapply, and also about set operations like setdiff, union, intersect, etc. I've needed those set operations before. Is there documentation somewhere with just useful stuff like that?

Last edited by BruceZ; 07-29-2014 at 02:09 AM.
O8 nut low question Quote
07-29-2014 , 04:33 AM
Quote:
Originally Posted by BruceZ
That's definitely the way to do it. In what way to you feel it's probably buggy?
I didn't test it. I just kept correcting my code until I was able to reproduce the number for the A2KK case. Sure, it would be very surprising to have a bug and reproduce that number, but at least I should have tested for the most simple case (45xx type hands).

Quote:
I learned from your code that I could use combn to generate a list and then use lapply/vapply, and also about set operations like setdiff, union, intersect, etc. I've needed those set operations before. Is there documentation somewhere with just useful stuff like that?
In my experience, when you need to do a task that might be of general interest, it's likely that a R function that efficiently does that task exists. Unfortunately, there isn't an easy way to retrieve it. I routinely ask myself: How R developer would call a function that does what I'm looking for? and then I start to write on the R prompt ? followed by the first letters of my guesses and the tab button hoping for a completion. I routinely keep doing this, even if now I know many functions I ignored earlier. As laughable this method could be, it helped me to find many functions (more often than not I found something that I didn't need in that moment, but was valuable later).

It is also important to read the body of a known function. You might learn other useful functions called by the known function. Of course reading stackOverflow and R-bloggers helps a lot.

I found, for instance, functions like match (matching the elements of two arrays), findInterval (bins the values of an array), sub and similar (string manipulation), uniroot (finds the zero of a function) with this method. I got crazy doing the same stuff when I didn't know these functions.

Another hint I could gave you is to read the help of any R function carefully. Often, there are optional arguments that seems useless, but actually can radically enhance the utility of a function. As you pointed out, the simplify argument of combn is one of them, making that function more flexible (ready to be used by lapply/vapply). I learned that every argument of a function exists for a reason.

Sorry I couldn't point you to specific resources, I hope that you might find somewhat useful what I wrote.
O8 nut low question Quote
07-29-2014 , 11:14 AM
Quote:
Originally Posted by nickthegeek
I didn't test it. I just kept correcting my code until I was able to reproduce the number for the A2KK case. Sure, it would be very surprising to have a bug and reproduce that number, but at least I should have tested for the most simple case (45xx type hands).
I ran a test with c(1,2,3,13) on a deck with no aces, twos, or threes, and c(2,3,4,13) on a deck with no two's threes, or fours, and compared the result to my previous scripts which only had a problem when you pair one of your hole cards. The results matched yours. I think that tells you something since there's no reason to think your script would be sensitive to pairing hole cards.

I wouldn't think your script is probably buggy. I think it's likely correct. It's not that hard to find the hole cards that make the nuts. Usually it's just the 2 lowest cards that aren't already on the board, but in some cases there are multiple ones that make the nuts. You identified those as the case where there are exactly 5 ranks less than 6 on the board (A2345) in which case any 2 hole cards A-5 make the nuts, and the case where there are exactly 4 ranks less than 6 on the board, in which case the hole cards consist of the missing rank less than 6 combined with any of the other cards A-5. Right? Somehow I thought this would be a bigger deal than it actually is, so I never pursued it.

Those were good ways to find information. I didn't know about findinterval or sub. My primary method of finding stuff that works well is to just google R and what I want to do. I always find stuff that way, usually on stackOverflow or one of the R blogs.

Last edited by BruceZ; 07-29-2014 at 11:29 AM.
O8 nut low question Quote
07-29-2014 , 02:02 PM
Quote:
Originally Posted by BruceZ
It's not that hard to find the hole cards that make the nuts. Usually it's just the 2 lowest cards that aren't already on the board, but in some cases there are multiple ones that make the nuts. You identified those as the case where there are exactly 5 ranks less than 6 on the board (A2345) in which case any 2 hole cards A-5 make the nuts, and the case where there are exactly 4 ranks less than 6 on the board, in which case the hole cards consist of the missing rank less than 6 combined with any of the other cards A-5. Right?
Exactly right. You explained better than I ever could (and should, in my previous post).

Glad you performed some test (and that my code passed it!). Glad also that you learned the existence of useful R functions. I guess the only difficulty in this problem was to switch the perspective from "given a hand which are the boards that give the hand a nut low" to "given a board, which are the two card combos that form the nut low", the latter being much simpler to solve.
O8 nut low question Quote
07-29-2014 , 07:05 PM
So to summarize the results:

A2KK: 24.8%

A23K: 43.1%

234K: 22.5%

You can download R and run the function getNutLowProb below for any hand. You specify suits with numbers, so the 4 kings would be 13, 113, 1013, 10013. So for A2KK you could do

getNutLowProb(c(1,2,13,113))

It could take a few minutes to spit out an answer.

I simplified nick's code to use just 2 functions, and I added a line to only check the boards that have 3 or more cards less than 8. Together these changes make the code run 17% faster on A2KK. I expected a 26% increase from only checking those boards alone, but that only made about a 7% difference even though the time needed to remove those boards was maybe 1%. How do you explain that? You'd think it should scale linearly with the number of boards it has to check. There must be some kind of overhead, maybe due to the large amount of memory used. I thought that combining the functions took longer before, but it just wasn't working right, and it's actually faster.

Code:
# Function to compute P(nut low with hand)

getNutLowProb = function(hand) {
  deck = c(1:13,101:113,1001:1013,10001:10013)
  deck = deck[-which(deck %in% hand)]%%100  # remove hole cards from deck
  hand = hand%%100  # remove suit from hand
  boards = combn(deck,5,simplify=FALSE)   # get all boards
  boards = boards[which(vapply(boards,function(x) sum(x <= 8) >= 3,TRUE))]  # only boards with 3 or more low cards
  sum(vapply(boards,checkNutLow,TRUE,hand))/choose(48,5)   # count nut boards, compute probability
}

# Function to check if hand has nuts for board

checkNutLow = function(board,hand) {
  board.u = unique(board)   # get unique ranks
  low = board.u[which(board.u <= 8)]   # get ranks <= 8
  if (length(low) < 3) {   # if fewer than 3, no nuts
    return(FALSE)
  } else {
      below6 = length(board.u[which(board.u < 6)])   # number of ranks < 6
      if (below6 < 4) {   # if fewer than 4, nuts is 2 lowest not on board
        nuts = matrix(setdiff(1:5,low)[1:2],ncol=1)  
      } else if (below6 == 4) {   # if exactly 4, nuts is missing rank and any other A-5
          nuts = matrix(c(rep(setdiff(1:5,low),4),sort(low)[1:4]),nrow=2,byrow=TRUE)
      } else {   # if exactly 5, nuts is any two A-5
          nuts = combn(5,2)
      }
      return(any(apply(nuts,2,function(x) all(x %in% hand))))   # return TRUE if hand has nuts
  }
}

Last edited by BruceZ; 07-29-2014 at 08:20 PM.
O8 nut low question Quote
07-29-2014 , 08:28 PM
Thanks guys! Funny how a simple question can get so involved.
Bottom line, I don't have to see every flop with 234x.
O8 nut low question Quote
07-30-2014 , 07:36 AM
I see why removing the boards with fewer than 3 low cards didn't make a linear reduction in time. Those boards don't take as much time to process because they are discarded immediately. duh
O8 nut low question Quote
07-30-2014 , 08:15 AM
Quote:
Originally Posted by BruceZ
I see why removing the boards with fewer than 3 low cards didn't make a linear reduction in time. Those boards don't take as much time to process because they are discarded immediately. duh
Some (small) improvements on the code could be made.

First of all, if the hand doesn't contain at least two different ranks 5 or lower, you can return 0 without leaving the user wait a few minutes for an obvious result.

Then you can exploit some features of the input hand. For instance, if the hand doesn't contain an Ace, you only look for the boards with at least an Ace. For 45xx hands you just look for boards containing A23.

Furthermore, there is no reason to build a matrix for my (now defunct) getNutLow function. If in the boards there aren't at least three low ranks you return false. If there are 5 cards below six, you can return true directly, since now we are testing only hands having two ranks 5 or lower. If there four cards below 6, you return true if the hand contains the missing card (it must contain another A-5). In the other cases, you just check if the two lowest missing card in the board are present in the input hand.

Those are not that much of an improvement, and I feel that the algorithm could be quite faster. Here the code updated.

Code:
getNutLowProb = function(hand) {
  deck = c(1:13,101:113,1001:1013,10001:10013)
  deck = deck[-which(deck %in% hand)]%%100  # remove hole cards from deck
  hand = hand%%100  # remove suit from hand
  if (sum(unique(hand)<6)<2) return(0)
  boards = combn(deck,5,simplify=FALSE)   # get all boards
  mandatory.on.boards<-(1:min(hand))[-min(hand)]
  boards = boards[which(vapply(boards,function(x) sum(unique(x) <= 8) >= 3 && all(mandatory.on.boards %in% x),TRUE))]  # only boards with 3 or more low cards and containing the mandatory cards
  sum(vapply(boards,checkNutLow,TRUE,hand))/choose(48,5)   # count nut boards, compute probability
}

# Function to check if hand has nuts for board

checkNutLow = function(board,hand) {
  board.u = unique(board)   # get unique ranks
  low = board.u[which(board.u <= 8)]   # get ranks <= 8
  if (length(low) < 3) {   # if fewer than 3, no nuts
    return(FALSE)
  } else {
      below6 = length(board.u[which(board.u < 6)])   # number of ranks < 6
      if (below6 < 4) {   # if fewer than 4, nuts is 2 lowest not on board
   	nuts<-setdiff(1:5,low)[1:2]
      } else if (below6 == 4) {   # if exactly 4, nuts is missing rank and any other A-5
  	nuts<-setdiff(1:5,low)
      } else {   # if exactly 5, nuts is any two A-5
  	return(TRUE)
      }
 	return(all(nuts %in% hand)) # return TRUE if hand has nuts
  }
}
O8 nut low question Quote
07-31-2014 , 04:25 AM
Finally I produced something I shouldn't be ashamed of!

I dramatically improved my code just by nothing a couple of things.

First, in this problem just the rank matters. By generating all the boards, the old code evaluated the nut low for many basically identical boards.

So, you just need to do that for every different (in the sense of having different ranks) board. A board can contain 2,3,4 or 5 different ranks. You discard immediately the 2 rank boards (can't be any low). For the others, you have to evaluate the "cardinality" (i.e. the number of different boards with those ranks). A board with 5 ranks can be realized in n_1*n_2*n_3*n_4*n_5 ways, n_i being the number of cards that rank has (you have to remove your hand). A 4 rank board must contain a pair; a 3 rank board can contain either a trips or two pair. In any case, it's easy to evaluate the number of combos corresponding to a board type. For doing so I added the getBoardCardinality function.

Here is the code:

Code:
# Function to check if hand has nuts for board

checkNutLow = function(board,hand) {
  board.u = unique(board)   # get unique ranks
  low = board.u[which(board.u <= 8)]   # get ranks <= 8
  if (length(low) < 3) {   # if fewer than 3, no nuts
    return(FALSE)
  } else {
      below6 = length(board.u[which(board.u < 6)])   # number of ranks < 6
      if (below6 < 4) {   # if fewer than 4, nuts is 2 lowest not on board
   	nuts<-setdiff(1:5,low)[1:2]
      } else if (below6 == 4) {   # if exactly 4, nuts is missing rank and any other A-5
  	nuts<-setdiff(1:5,low)
      } else {   # if exactly 5, nuts is any two A-5
  	return(TRUE)
      }
 	return(all(nuts %in% hand)) # return TRUE if hand has nuts
  }
}

getBoardCardinality<-function(board,cardNumber)
	{
	tavola<-cardNumber[board]
	if (length(board)==5) return(prod(tavola))
	if (length(board)==4) 
		{
		res<-numeric(4)
		for (i in 1:4) res[i]<-choose(tavola[i],2)*prod(tavola[-i])
		return(sum(res))
		}
	if (length(board)==3)
		{
		res<-numeric(3)
		for (i in 1:3) 
			{
			res[i]<-choose(tavola[i],3)*prod(tavola[-i])+tavola[i]*prod(choose(tavola[-i],2))
			}
		return(sum(res))
		}
	}


getNutLowProb <- function(hand) 
	{
	deck <- c(1:13,101:113,1001:1013,10001:10013)
	deck<-sort(setdiff(deck,hand)%%100)
	cardNumber<-table(deck)
	hand<-unique(hand%%100)  
	if (sum(hand<6)<2) return(0)
	deck<-1:13
	boardRanks<-choose(13,3:5)
	intervals<-c(0,cumsum(boardRanks))
	boards<-vector(sum(boardRanks),mode="list")
	for (i in 1:3) boards[(intervals[i]+1):intervals[i+1]]<-combn(deck,i+2,simplify=FALSE)
	mandatory.on.boards<-(1:min(hand))[-min(hand)]
	boards <- boards[which(vapply(boards,function(x) sum(x<= 8) >= 3 && all(mandatory.on.boards %in% x),TRUE))]
	numerosity<-vapply(boards,getBoardCardinality,1,cardNumber=cardNumber)
	isLow<-vapply(boards,checkNutLow,TRUE,hand)
	sum(isLow*numerosity)/choose(48,5)
	}
And here we are:

Code:
> system.time(res<-getNutLowProb(c(1,2,13,113)))
   user  system elapsed 
  0.076   0.000   0.075 
> res
[1] 0.2479186
> getNutLowProb(c(1,2,3,13))
[1] 0.4313767
> getNutLowProb(c(2,3,4,13))
[1] 0.2250628
Same old results, but a speed up of a factor ~ 1500 on my PC.
O8 nut low question Quote

      
m